00 Kabuk değişkeni vs ortam değişkeni
Shell değişkenleri yalnızca mevcut kabuğa görünür. Ortam (environment) değişkenleri ise alt süreçlere miras olarak geçer.
# kabuk değişkeni tanımla (sadece bu kabukta görünür)
YEREL="değer"
echo "$YEREL"
değer
# alt süreçte göremez
bash -c 'echo "Alt süreç: $YEREL"'
Alt süreç: ← boş, miras geçmedi
# export ile ortam değişkenine dönüştür
export YEREL
bash -c 'echo "Alt süreç: $YEREL"'
Alt süreç: değer ← miras geçti
# mevcut ortam değişkenlerini listele
env # tüm ortam değişkenleri
printenv # aynı (bazı sistemlerde daha temiz çıktı)
printenv PATH # tek değişken
# kabuk değişkenlerini de dahil tüm değişkenler
set # çok uzun; grep ile filtrele
set | grep "^MY" # MY ile başlayanlar
Kabuk değişkenleri yalnızca mevcut bash oturumuna görünür. export ile işaretlenmiş değişkenler, o kabuktan başlatılan tüm alt süreçlerin ortamına kopyalanır. Alt süreçte yapılan değişiklik üst kabuğa yansımaz.
01 env — ortam değişkenlerini yönetmek
env hem ortam değişkenlerini görüntüler hem de geçici değişkenlerle komut çalıştırmaya yarar.
# tüm ortam değişkenlerini listele
env
HOME=/home/ali
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
USER=ali
LANG=tr_TR.UTF-8
... (tüm export edilmiş değişkenler)
# belirli değişkene bak
printenv HOME
/home/ali
# geçici değişkenle komut çalıştır
# (mevcut kabukta değişmez, sadece o komuta geçer)
env DEBUG=1 ./myapp
env LANG=en_US.UTF-8 date
# -u: belirtilen değişkeni ortamdan kaldır
env -u HOME bash -c 'echo $HOME'
← HOME yok, boş
# -i: temiz (boş) ortamda komut çalıştır
# tüm mevcut değişkenler sıfırlanır
env -i PATH=/usr/bin bash -c 'env'
PATH=/usr/bin ← sadece bu var
# shebang'de env kullanımı: doğrudan yol yerine
# sistem PATH'inden python bul — taşınabilir
#!/usr/bin/env python3
#!/usr/bin/env node
#!/usr/bin/env bash
DEBUG=1 ./script#!/usr/bin/python3 yerine #!/usr/bin/env python3 kullanmak, script'in farklı sistemlerde (farklı Python yollarında) çalışmasını sağlar. env komutu PATH'i tarayarak doğru yorumlayıcıyı bulur.
02 export ve unset — kapsam genişletme
export değişkeni alt süreçlere miras bırakır, unset değişkeni tamamen kaldırır.
# export: tanımla ve dışa aktar (en yaygın form)
export API_KEY="abc123"
export DB_HOST="localhost"
export MAX_RETRIES=3
# önce tanımla, sonra export — aynı sonuç
API_KEY="abc123"
export API_KEY
# export -n: export işaretini kaldır (kabuk değişkeni haline getir)
export -n API_KEY
# değişken hâlâ var ama artık alt süreçlere geçmez
# unset: değişkeni tamamen sil
unset API_KEY
echo "$API_KEY"
← boş, değişken yok
# export -p: export edilmiş tüm değişkenleri declare formatında göster
export -p
declare -x HOME="/home/ali"
declare -x PATH="/usr/local/bin:/usr/bin"
declare -x USER="ali"
...
# PATH'e dizin eklemek (kalıcı için ~/.bashrc'ye yaz)
export PATH="$HOME/.local/bin:$PATH"
# önemli sistem değişkenleri
echo "$HOME" # kullanıcı ev dizini
echo "$USER" # mevcut kullanıcı adı
echo "$SHELL" # mevcut shell
echo "$LANG" # dil/karakter seti
echo "$TERM" # terminal tipi (xterm-256color vb.)
echo "$PWD" # mevcut dizin (cd ile otomatik güncellenir)
echo "$$" # mevcut kabuğun PID'i
echo "$?" # son komutun çıkış kodu
echo "$#" # script argüman sayısı
03 alias — komut kısaltmaları
alias uzun veya tekrar eden komutlara kısa isimler atar. İnteraktif kullanım için güçlü; script'lerde güvenilir değil.
# alias tanımla
alias ll='ls -lh --color=auto'
alias la='ls -lah --color=auto'
alias grep='grep --color=auto'
alias ..='cd ..'
alias ...='cd ../..'
alias cls='clear'
alias h='history'
# tüm mevcut alias'ları listele
alias
alias ll='ls -lh --color=auto'
alias la='ls -lah --color=auto'
...
# alias'ı kaldır
unalias ll
# tüm alias'ları kaldır
unalias -a
# alias bypass etmek (gerçek komutu çalıştır)
\ls # backslash ile alias'ı atla
command ls # veya command ile
# pratik alias örnekleri
alias gs='git status'
alias gp='git pull'
alias gd='git diff'
alias mkd='mkdir -p'
alias ports='ss -tlnp'
alias myip='curl -s ifconfig.me'
alias df='df -h'
alias du='du -h'
alias free='free -h'
# !!! alias'ı kalıcı yapmak için ~/.bashrc'ye ekle
echo "alias ll='ls -lh --color=auto'" >> ~/.bashrc
source ~/.bashrc # yenile
Alias'lar varsayılan olarak script'lerde aktif değildir (etkileşimli olmayan kabuk). Script içinde alias kullanmak gerekiyorsa shopt -s expand_aliases eklenmelidir — ama genelde fonksiyon tercih edilir.
04 history — komut geçmişi
Bash her oturumda çalıştırılan komutları ~/.bash_history dosyasına kaydeder. history komutu bu geçmişe erişmeyi sağlar.
# tüm geçmişi listele (satır numarasıyla)
history
498 ls -lah
499 cd /etc
500 cat passwd
# son N komutu göster
history 20
# tarih/saat ile göster (HISTTIMEFORMAT ayarlandıysa)
export HISTTIMEFORMAT="%F %T "
history 5
498 2026-04-10 14:23:01 ls -lah
499 2026-04-10 14:23:45 cd /etc
# history genişletme (history expansion)
!! # son komutu tekrar çalıştır
!499 # 499 numaralı komutu çalıştır
!cat # en son 'cat' ile başlayan komutu çalıştır
!-2 # iki komut öncekini çalıştır
# son komutun argümanını al
ls /etc/nginx
cd !$ # !$ = son komutun son argümanı (/etc/nginx)
# tüm argümanlar
cp dosya.txt /tmp/
echo !* # !* = son komutun tüm argümanları
dosya.txt /tmp/
# ikame ve tekrar çalıştır (^eski^yeni)
ls /usr/bin
^bin^sbin # ls /usr/sbin olarak çalıştırır
sudo !! (son komutu root olarak çalıştır).En yaygın kullanım kalıbı: bir komutu sudo gerektirdiğini sonradan fark etmek. sudo !! son komutu root olarak tekrar çalıştırır.
05 history gelişmiş: HISTCONTROL ve arama
Geçmiş davranışını değiştiren değişkenler, gizlilik için komutları atlatma ve Ctrl+R ile hızlı arama.
# önemli history değişkenleri (~/.bashrc'ye ekle)
export HISTSIZE=10000 # bellekteki komut sayısı
export HISTFILESIZE=20000 # dosyadaki komut sayısı
export HISTFILE=~/.bash_history # geçmiş dosyası
# HISTCONTROL: yineleme ve boşluk kontrolü
export HISTCONTROL=ignoreboth
# ignoredups → aynı komut arka arkaya gelirse sadece bir kez kaydet
# ignorespace → boşlukla başlayan komutları kaydetme
# ignoreboth → ikisi de
# erasedups → geçmişteki tüm tekrarları sil
# boşlukla başlayan komut history'e girmez (gizlilik)
export SECRET_TOKEN="abc123" ← başa boşluk
mysql -u root -ppassword ← parola kayıt dışı
# belirli komutları tamamen dışla
export HISTIGNORE="ls:ll:la:cd:pwd:clear:history:exit"
# geçmiş dosyasına anlık yaz (birden fazla terminal oturumunda)
shopt -s histappend # üzerine yazma değil, ekle
export PROMPT_COMMAND="history -a" # her promptta diske yaz
# history temizle
history -c # bellekteki geçmişi temizle
history -w # belleği dosyaya yaz (temizlenmiş hali)
history -d 499 # 499 numaralı satırı sil
# geçmişi yeniden yükle
history -r # dosyadan belleğe yükle
# Ctrl+R: geçmişte geri arama (reverse-i-search)
# 1. Ctrl+R'ye bas
# 2. Arama terimini yaz
# 3. Ctrl+R ile önceki eşleşmeye geç
# 4. Enter ile çalıştır, sağ ok ile düzenle, Ctrl+C ile iptal
(reverse-i-search)`ssh': ssh -p 2222 ali@sunucu.com
# fzf kuruluysa: çok daha güçlü geçmiş araması
# Ctrl+R artık fzf arayüzüne açılır
sudo apt install fzf
# ~/.bashrc'de aktive etmek için:
source /usr/share/doc/fzf/examples/key-bindings.bash
# geçmişi grep ile ara
history | grep "docker"
history | grep -i "ssh" | tail -20
# en çok kullanılan komutlar
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10
142 git
98 ls
76 cd
54 docker
43 vim
06 source — script ve konfigürasyon yükleme
source (veya .) bir script'i alt süreç başlatmadan mevcut kabukta çalıştırır. Değişkenler ve fonksiyonlar mevcut kabukta kalır.
# ~/.bashrc değişikliklerini hemen uygula
source ~/.bashrc
# veya kısa form (POSIX)
. ~/.bashrc
# source vs ./script farkı
# ./script.sh çalıştırmak: alt süreç açar
# → değişkenler üst kabuğa geri dönmez
#!/bin/bash # script.sh
RENK="mavi"
./script.sh
echo "$RENK" # boş — alt süreçte tanımlandı
source ./script.sh
echo "$RENK" # mavi — mevcut kabukta tanımlandı
# kütüphane script'i yükleme
# lib/utils.sh içinde fonksiyonlar var
source ./lib/utils.sh
# artık utils.sh içindeki fonksiyonlar kullanılabilir
log_info "Başlıyor"
validate_input "$1"
# .env dosyasını yükle (anahtar=değer formatında)
# .env içeriği:
# DB_HOST=localhost
# DB_PORT=5432
# API_KEY=secret
source .env
echo "$DB_HOST"
localhost
# daha güvenli .env yükleme (export ile)
set -a # sonraki tüm değişkenleri auto-export et
source .env
set +a # auto-export kapat
# veya env dosyasıyla komut çalıştır
env $(cat .env | grep -v "^#" | xargs) node app.js
source .env ile .env dosyası bash komutu olarak çalıştırılır. Dosyada yorum satırları, boş satırlar veya bash syntax'ı varsa sorun çıkabilir. Daha sağlam çözüm için dotenv gibi bir araç ya da grep -v "^#" .env | xargs kullanın.
# ~/.bashrc'de genellikle kaynak alınan dosyalar
# sistem geneli tanımlar
[ -f /etc/bashrc ] && source /etc/bashrc
# kişisel alias'lar ayrı dosyada
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
# tamamlama (completion) kuralları
[ -f /usr/share/bash-completion/bash_completion ] && \
source /usr/share/bash-completion/bash_completion
# nvm, pyenv, rvm vb. araçlar
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
07 Özet ve referans
Hatırlanacaklar
- Kabuk değişkenleri sadece mevcut kabukta yaşar;
exportile alt süreçlere miras geçer unsetdeğişkeni tamamen siler;export -nsadece export bayrağını kaldırırenv -itemiz (boş) ortamda komut çalıştırır — CI/test senaryoları için değerli#!/usr/bin/env python3shebang kalıbı PATH'i tarar — taşınabilir- Alias'lar
~/.bashrc'ye yazılmadan oturum kapanınca kaybolur \komutveyacommand komutile alias bypass edilir- Alias'lar script'lerde varsayılan olarak devre dışıdır — fonksiyon kullanın
sudo !!en sık kullanılan history genişletmesidirHISTCONTROL=ignoreboth: tekrarları ve boşlukla başlayanları atla- Boşlukla başlayan komut (
komut) history'e girmez — şifreler için kullanın sourcemevcut kabukta çalıştırır;./script.shalt süreç açar — kritik farkset -a; source .env; set +aile tüm .env değişkenlerini export et- Birden fazla terminal açık olduğunda
shopt -s histappendgeçmişleri korur
# env
env # tüm ortam değişkenleri
env DEBUG=1 ./script # geçici değişkenle çalıştır
env -u HOME bash # HOME kaldırılmış ortamda
env -i PATH=/usr/bin bash # temiz ortamda
# export / unset
export AD="değer" # tanımla ve dışa aktar
export -n AD # export bayrağını kaldır
unset AD # tamamen sil
export -p # tüm export'ları listele
# alias
alias kısa='uzun komut' # tanımla
alias # listele
unalias kısa # kaldır
\komut # alias bypass
# history
history 20 # son 20
!! # son komutu tekrar
!499 # N numaralı komutu
!ssh # ssh ile başlayan son komut
!$ # son komutun son argümanı
history -c # bellekteki geçmişi temizle
history -d 499 # satır sil
gizli komut # boşluk → history'e girmez
# source
source ~/.bashrc # yenile
. ~/.bashrc # kısa form
source ./lib.sh # kütüphane yükle
set -a; source .env; set +a # .env'i export ederek yükle
Devam: echo ve printf ile metin çıktısı · Unix felsefesi ve pipe · which, type ve komut arama