← Bash tools
TEKNİK REHBER BASH TOOLS KABUK ORTAMI 2026

env, export, alias,
history ve source

Kabuk değişkenleri ile ortam değişkenleri arasındaki fark, alias ile komut kısaltmaları, history ile komut geçmişi ve source ile script yükleme — günlük bash kullanımının çekirdeği.

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.

bash
# 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
KAPSAM MODELİ

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.

YEREL=değer
Kabuk değişkeni. Yalnızca mevcut kabukta erişilebilir, alt süreçlere geçmez.
export YEREL
Değişkeni ortam değişkeni olarak işaretle. Alt süreçler miras alır.
export AD=değer
Tanımlama ve dışa aktarma tek satırda. En yaygın form.
env
Mevcut ortam değişkenlerini listeler (yalnızca export edilenler).

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.

bash
# 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
-u DEĞIŞKEN
Komutu çalıştırırken belirtilen değişkeni ortamdan kaldır. Mevcut kabuk etkilenmez.
-i
Boş ortamda başla (inherit). Mevcut ortam değişkenleri miras alınmaz. Sonradan AD=değer ile eklenir.
AD=değer komut
Yalnızca o komuta geçici olarak ortam değişkeni ekle. env olmadan da çalışır: DEBUG=1 ./script
SHEBANG KALIBRI

#!/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.

bash
# 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ı
export AD=değer
Ortam değişkeni tanımla. Alt süreçlere miras geçer.
export -n AD
Export bayrağını kaldır. Değişken mevcut kabukta kalır ama alt süreçlere geçmez.
export -p
Tüm export edilmiş değişkenleri declare -x formatında listele. Yedekleme/aktarma için kullanışlı.
unset AD
Değişkeni (veya fonksiyonu) tamamen kaldır. Hem kabuk hem ortam tablosundan silinir.

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.

bash
# 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 AD='komut'
Komut kısaltması tanımla. Tırnak içinde boşluk ve bayrak kullanılabilir.
alias
Argümansız: tüm mevcut alias'ları listeler.
unalias AD
Alias'ı kaldır.
unalias -a
Tüm alias'ları kaldır.
\komut
Alias varsa bile orijinal komutu çalıştır (backslash bypass).
SCRIPT'TE ALIAS

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.

bash
# 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
history N
Son N komutu listele.
!!
Son komutu tekrar çalıştır. En yaygın kullanım: sudo !! (son komutu root olarak çalıştır).
!N
Geçmişteki N numaralı komutu çalıştır.
!string
En son o string ile başlayan komutu çalıştır.
!$
Son komutun son argümanı.
!*
Son komutun tüm argümanları.
^eski^yeni
Son komuttaki "eski" yerine "yeni" koyarak tekrar çalıştır.
sudo !!

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.

bash
# ö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
bash — Ctrl+R ters arama
# 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
HISTSIZE
Bellekte (mevcut oturumda) tutulacak maksimum komut sayısı.
HISTFILESIZE
Disk dosyasında tutulacak maksimum satır sayısı. HISTSIZE'dan büyük olmalı.
HISTCONTROL
ignoredups (tekrar kaydetme), ignorespace (boşlukla başlayanı atlat), ignoreboth, erasedups.
HISTIGNORE
Kolon ayrılmış desen listesi. Bu desenlerle eşleşen komutlar kaydedilmez.
history -c
Bellekteki geçmişi temizle. Ardından -w ile dosyaya yazarak kalıcı hale getir.
history -d N
N numaralı satırı geçmişten sil. Yanlışlıkla girilen parola gibi hassas komutlar için.

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.

bash
# ~/.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 dosya
Dosyayı mevcut kabukta çalıştır. Değişkenler, alias'lar, fonksiyonlar mevcut oturuma eklenir.
. dosya
source ile özdeş, POSIX uyumlu kısa form. Tüm sh/bash/dash/zsh'ta çalışır.
set -a
Sonradan tanımlanan tüm değişkenleri otomatik olarak export et. source .env ile birlikte kullanışlı.
GÜVENLİ .env

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.

bash — ~/.bashrc yapısı
# ~/.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; export ile alt süreçlere miras geçer
  • unset değişkeni tamamen siler; export -n sadece export bayrağını kaldırır
  • env -i temiz (boş) ortamda komut çalıştırır — CI/test senaryoları için değerli
  • #!/usr/bin/env python3 shebang kalıbı PATH'i tarar — taşınabilir
  • Alias'lar ~/.bashrc'ye yazılmadan oturum kapanınca kaybolur
  • \komut veya command komut ile 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şletmesidir
  • HISTCONTROL=ignoreboth: tekrarları ve boşlukla başlayanları atla
  • Boşlukla başlayan komut ( komut) history'e girmez — şifreler için kullanın
  • source mevcut kabukta çalıştırır; ./script.sh alt süreç açar — kritik fark
  • set -a; source .env; set +a ile tüm .env değişkenlerini export et
  • Birden fazla terminal açık olduğunda shopt -s histappend geçmişleri korur
bash — hızlı başvuru
# 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