Bash'te alias, bir komutun başına yazılan kısa bir ada uzun bir metni bağlar: alias ad='değer' yazdığınızda, kabuk satırı okurken komut konumundaki ad kelimesini değer metniyle değiştirir. Tanımı kalıcı yapmak için aynı satırı ~/.bashrc dosyanıza eklersiniz; tanımlı alias listesini alias, bir tanımı silmeyi unalias ad ile yaparsınız. Alias argüman alamaz, betiklerde varsayılan olarak çalışmaz ve satır okunurken genişletildiği için bazı şaşırtıcı sonuçlar doğurur; kılavuzun kendisi de çoğu iş için fonksiyonun daha iyi bir seçim olduğunu söyler.
Bu yazıda alias'ın tam olarak hangi konumda ve ne zaman genişletildiğini, alias ve unalias komutlarının seçeneklerini, sonda boşluk bırakmanın etkisini, alias'ı geçici olarak atlamanın yollarını, betiklerde expand_aliases seçeneğini ve alias ile fonksiyon arasındaki farkı çalıştırılmış örneklerle göreceksiniz. Kaynak, GNU Bash Reference Manual'ın 6.6 Aliases bölümü ve yerleşik komut açıklamalarıdır.
Alias nasıl tanımlanır ve listelenir?
Tanım için eşittir işaretinin iki yanında boşluk olmamalı ve değer, içinde boşluk varsa tırnak içine alınmalıdır; bu, değişken atamasıyla aynı kuraldır. Değeri genellikle tek tırnakla yazarsınız; böylece içindeki $ ya da ters eğik çizgi tanım anında değil, alias kullanıldığında yorumlanır. Tırnak türlerinin farkı için tek tırnak ve çift tırnak farkı yazısına bakın.
alias komutu argümansız ya da -p ile çağrıldığında tüm alias'ları, yeniden girdi olarak kullanılabilecek biçimde (alias ad='değer') basar. Değer verilmeden yalnızca bir ad yazarsanız o alias'ın tanımını gösterir; böyle bir alias yoksa hata verir ve sıfırdan farklı durumla döner. unalias ad tek bir tanımı, unalias -a hepsini siler. Bir adın alias mı, yerleşik komut mu, fonksiyon mu olduğunu type ile öğrenirsiniz; type -t yalnızca tek kelimelik türü yazar. Aşağıdaki örnek bir betik içinde çalıştığı için önce expand_aliases seçeneğini açıyor; bunun nedenini ilerideki bölümde göreceksiniz:
shopt -s expand_aliases
alias ll='printf "[%s]\n"'
alias yaz='echo'
ll a b
# çıktı:
# [a]
# [b]
type -t ll # çıktı: alias
type ll # çıktı: ll is aliased to `printf "[%s]\n"'
alias ll # çıktı: alias ll='printf "[%s]\n"'
echo "${BASH_ALIASES[yaz]}" # çıktı: echo
unalias ll
alias ll
echo "durum: $?"
# çıktı: ornek.sh: line 15: alias: ll: not found
# çıktı: durum: 1BASH_ALIASES, alias listesinin ilişkisel dizi görünümüdür: anahtarlar alias adları, değerler tanımlardır. Diziye eleman eklemek alias tanımlar; ama kılavuz, bir elemanı unset ile silmenin şu an alias'ı listeden kaldırmadığını belirtir. Silmek için her zaman unalias kullanın. İlişkisel dizilerin genel kullanımı ilişkisel dizi declare -A yazısında.
Alias ne zaman ve nerede genişletilir?
Kabuk bir kelimeyi alias olarak değerlendirmek için iki koşul arar: kelime tırnaksız olmalı ve basit bir komutun ilk kelimesi olabilecek konumda durmalıdır. Eşleşirse kelime değerle değiştirilir ve kabuk o değeri sanki baştan öyle yazılmış gibi okur. Değerin ilk kelimesi de alias olarak denetlenir, ancak o anda genişletilen alias ile aynı olan kelime ikinci kez genişletilmez. Bu sayede alias ls='ls -F' gibi, kendi adını kullanan bir tanım sonsuz döngüye girmeden çalışır.
Alias adında /, $, ters tırnak, =, kabuğun metakarakterleri (boşluk, |, &, ;, parantezler, < ve >) ve tırnak karakterleri bulunamaz. Değer ise geçerli herhangi bir kabuk girdisini, metakarakterler dahil, içerebilir; yani alias guncelle='make && make install' gibi birden fazla komut barındıran bir değer mümkündür.
Bir alias'ın tek bir argümanın yerine geçmediğini hatırlayın: argüman konumundaki bir kelime normalde alias olarak denetlenmez. Bunun tek istisnası, değeri boşlukla biten bir alias'tır. Böyle bir alias genişletildiğinde kabuk, ondan sonraki kelimeyi de alias olarak denetler:
shopt -s expand_aliases
alias yedekle='cp -a'
alias once='echo çalışacak:'
alias once2='echo çalışacak: '
once yedekle # çıktı: çalışacak: yedekle
once2 yedekle # çıktı: çalışacak: cp -aonce ile once2 arasındaki tek fark değerin sonundaki boşluktur. Bu özellik, başka bir komutu argüman olarak çalıştıran sarmalayıcı komutlarla birlikte kendi alias'larınızı kullanmak istediğinizde işe yarar.
Alias argüman alamaz: fonksiyon kullanın

Kılavuz açıkça belirtir: csh kabuğundaki gibi değer metninde argüman kullanmanın bir yolu yoktur. Alias yalnızca metin değişimi yapar; ondan sonra yazdığınız kelimeler değerin sonuna eklenir. Değerin içine $1 yazmak bu yüzden beklediğiniz şeyi yapmaz; $1, alias'ın değil, o anki kabuğun ya da betiğin ilk konumsal parametresi olarak genişler:
shopt -s expand_aliases
alias selamla='echo "Merhaba $1"'
selamla dünya
# çıktı: Merhaba dünyaBetik argümansız çalıştığı için $1 boş genişledi ve sonuç echo "Merhaba " dünya oldu; iki kelime arasındaki çift boşluk buradan gelir. Argüman gereken her durumda kabuk fonksiyonu yazın. Fonksiyon argümanları $1, $2 ve "$@" ile alır, varsayılan değer verebilir ve çok satırlı mantık içerebilir:
selamla() { printf 'Merhaba %s\n' "${1:-dünya}"; }
selamla # çıktı: Merhaba dünya
selamla Ayşe # çıktı: Merhaba AyşeFonksiyon tanımlamanın biçimleri ve değer döndürme yolları Bash fonksiyon tanımlama, ${1:-dünya} gibi varsayılan değer kalıpları ise parametre genişletme ve varsayılan değer yazısında.
| Özellik | alias | fonksiyon |
|---|---|---|
| Argüman kullanma | yok, kelimeler sona eklenir | $1, $2, "$@" ile var |
| Ne zaman yorumlanır | satır okunurken (metin değişimi) | çağrıldığında çalışır |
| Betikte varsayılan | kapalı (expand_aliases gerekir) | her zaman çalışır |
| Koşul, döngü, yerel değişken | yalnızca metin olarak | tam destek (local dahil) |
| Alt süreçlere aktarma | aktarılmaz | export -f ile aktarılabilir |
| Tipik kullanım | etkileşimli kabukta kısa komut kısaltması | yeniden kullanılan her mantık |
Alias geçici olarak nasıl atlanır?

Alias yalnızca tırnaksız bir kelimeye uygulandığı için, kelimenin herhangi bir kısmını tırnaklamak genişletmeyi engeller. En kısa yol başına ters eğik çizgi koymaktır. command yerleşik komutu da alias'ı atlar, çünkü o durumda alias adı artık komutun ilk kelimesi değil, command komutunun argümanıdır. Aşağıda kasıtlı olarak echo adını gölgeleyen bir alias tanımlıyoruz:
shopt -s expand_aliases
alias echo='echo [alias]'
echo merhaba # çıktı: [alias] merhaba
\echo merhaba # çıktı: merhaba
'echo' merhaba # çıktı: merhaba
command echo merhaba # çıktı: merhaba
type -t echo # çıktı: alias
unalias echo
type -t echo # çıktı: builtinBu teknik, örneğin rm için onay isteyen bir alias tanımladıysanız ve bir kez onaysız çalıştırmanız gerekiyorsa işe yarar. command yerleşik komutu fonksiyonları da atladığı için, aynı adlı bir fonksiyonun içinden gerçek komutu çağırmanın da standart yoludur.
Betiklerde alias: expand_aliases ve okuma zamanı
Kabuk etkileşimli değilse alias'lar genişletilmez; bunun için shopt -s expand_aliases gerekir. Bu seçenek etkileşimli kabuklarda varsayılan olarak açıktır. Seçenek kapalıyken alias tanımlamak hata vermez, ama kullanmaya çalıştığınızda kabuk adı sıradan bir komut gibi arar:
alias selam='echo merhaba'
selam
# çıktı: ornek.sh: line 2: selam: command not found
shopt -s expand_aliases
selam # çıktı: merhaba
alias selam2='echo ikinci'; selam2
# çıktı: ornek.sh: line 6: selam2: command not found
selam2 # çıktı: ikinciAltıncı satırdaki hata, kılavuzun kafa karıştırıcı olarak nitelediği kuralın sonucudur. Bash bir satırdaki komutları çalıştırmadan önce en az o satırın tamamını, bileşik bir komut söz konusuysa komutun bütün satırlarını okur ve alias'lar okunurken genişletilir, çalıştırılırken değil. Dolayısıyla aynı satırda tanımlanan alias, o satırın geri kalanında henüz yoktur; ancak bir sonraki satırdan itibaren geçerlidir. Aynı mantık bileşik komutlar ve fonksiyonlar için de geçerlidir:
shopt -s expand_aliases
if true; then
alias tarih_yaz='echo bugün'
tarih_yaz
fi
# çıktı: ornek.sh: line 4: tarih_yaz: command not found
tarih_yaz # çıktı: bugün
kur() {
alias gec='echo geçti'
}
kur
gec # çıktı: geçtiif bloğunun tamamı tek seferde okunduğu için, blok içindeki tarih_yaz satırı okunurken alias henüz tanımlı değildi. Fonksiyon tanımı da bir komuttur: fonksiyonun gövdesindeki alias'lar fonksiyon tanımlanırken genişletilir, içinde tanımlanan alias ise fonksiyon çalıştıktan sonra kullanılabilir hale gelir. Kılavuzun önerisi basittir: alias tanımlarını her zaman ayrı bir satıra yazın ve bileşik komutların içinde alias kullanmayın.
Aynı adda alias ve fonksiyon: sözdizimi hatası
Okuma zamanı kuralının beklenmedik bir yan etkisi daha vardır. Bir adın alias'ı tanımlıyken aynı adla fonksiyon tanımlamaya çalışırsanız, kabuk tanım satırını okurken önce alias'ı genişletir ve ortaya geçersiz bir sözdizimi çıkar:
shopt -s expand_aliases
alias selamla='echo "Merhaba"'
selamla() { echo "Merhaba $1"; }
# çıktı: ornek.sh: line 3: syntax error near unexpected token `('
# çıktı: ornek.sh: line 3: `selamla() { echo "Merhaba $1"; }'Kabuk aslında echo "Merhaba"() { ... } gibi bir şey gördü. Bu hata en çok, sistemin hazır ~/.bashrc dosyasında tanımlı bir alias'ı kendi fonksiyonunuzla değiştirmeye çalıştığınızda karşınıza çıkar. Çözüm, fonksiyonu tanımlamadan önceki ayrı bir satırda alias'ı kaldırmaktır:
shopt -s expand_aliases
alias selamla='echo "Merhaba"'
unalias selamla
selamla() { echo "Merhaba $1"; }
selamla Ali # çıktı: Merhaba AliSıra tersine çevrildiğinde, yani önce fonksiyon sonra aynı adlı alias tanımlandığında sözdizimi hatası oluşmaz; çünkü fonksiyon tanımı okunurken henüz bir alias yoktu. Bu durumda iki tanım yan yana yaşar ve hangisinin çalışacağı, bir sonraki bölümün konusu olan öncelik kuralına bağlıdır.
Alias, fonksiyon, yerleşik komut: hangisi önce çalışır?
Aynı ad birden fazla anlama gelebilir: bir alias, bir kabuk fonksiyonu, bir yerleşik komut ve PATH üzerinde bir program aynı anda var olabilir. Alias genişletmesi satır okunurken, yani komut aranmadan önce yapıldığı için, tırnaksız yazılmış bir adda alias her zaman ilk sözü söyler. Alias atlandığında ise kabuk komutu kendi arama sırasıyla bulur: önce fonksiyonlar, sonra yerleşik komutlar, en son PATH içindeki dosyalar. type -a bir adın bütün anlamlarını bu sırayla listeler ve gölgelenmiş bir komutu teşhis etmenin en hızlı yoludur:
shopt -s expand_aliases
selam() { echo "fonksiyon"; }
alias selam='echo alias'
selam # çıktı: alias
type -a selam
# çıktı:
# selam is aliased to `echo alias'
# selam is a function
# selam ()
# {
# echo "fonksiyon"
# }
\selam # çıktı: fonksiyon
unalias selam
type -t selam # çıktı: functionTers eğik çizgi alias'ı atladı, ama fonksiyonu atlamadı; bu yüzden \selam fonksiyonu çalıştırdı. Fonksiyonu da atlayıp doğrudan yerleşik komuta ya da programa ulaşmak istiyorsanız command, yalnızca yerleşik komutu istiyorsanız builtin kullanın. Etkileşimli kabukta bir alias'ın satırı nasıl değiştireceğini çalıştırmadan görmek için Readline'ın alias-expand-line komutu da vardır; varsayılan olarak bir tuşa bağlı değildir, bağlamayı Bash klavye kısayolları ve Readline yazısında anlatıyoruz.
Alias tanımlarını kalıcı yapmak
Komut satırında tanımlanan bir alias yalnızca o kabuk açık kaldığı sürece yaşar. Kalıcı olması için tanımı, her etkileşimli kabuğun okuduğu ~/.bashrc dosyasına eklersiniz. Hangi dosyanın hangi kabukta okunduğu .bashrc ve .bash_profile farkı yazısında ayrıntılı anlatılıyor. Çok sayıda alias'ınız varsa onları ayrı bir dosyada toplayıp ~/.bashrc içinden kaynak olarak eklemek düzeni korur; dosyanın adı tamamen sizin tercihinizdir:
# ~/.bashrc içine
if [ -f ~/.alias_tanimlari ]; then
. ~/.alias_tanimlari
fi
# ~/.alias_tanimlari içine (her tanım ayrı satırda)
alias ..='cd ..'
alias gs='git status'
alias r='fc -s'Son satırdaki r='fc -s' kılavuzun kendi önerdiği bir alias'tır: r son komutu, r cc ise cc ile başlayan son komutu yeniden çalıştırır. fc ve komut geçmişinin diğer araçları Bash history komut geçmişi yazısında. Dosyayı düzenledikten sonra değişikliği açık kabukta görmek için source ~/.bashrc çalıştırın; kaynak ekleme mekanizması source ve nokta komutu yazısında.
Sık yapılan hatalar

- Eşittir çevresinde boşluk:
alias ll = 'ls -l'bir tanım değildir; kabukll,=ve değeri ayrı ayrı alias adı olarak sorgular ve hata verir. Doğrusualias ll='ls -l'. - Değere $1 yazmak: alias argüman almaz; argüman gerekiyorsa fonksiyon yazın.
- Çift tırnakla tanımlayıp değişkeni dondurmak:
alias nerede="echo $PWD"tanım anındaki dizini sabitler. Değeri her kullanımda değerlendirmek için tek tırnak kullanın. - Betikte alias'a güvenmek:
expand_aliasesaçık değilse çalışmaz, açıksa da okuma zamanı kuralı yüzünden kırılgandır. Betiklerde fonksiyon tercih edin. - BASH_ALIASES elemanını unset ile silmeye çalışmak: kılavuza göre bu alias'ı listeden kaldırmaz;
unaliaskullanın. - Aynı adda fonksiyon tanımlamak: önce ayrı bir satırda
unaliasçalıştırın.
Sık Sorulan Sorular
Alias mı fonksiyon mu kullanmalıyım?
Kılavuzun yanıtı neredeyse her amaç için fonksiyondur. Alias'ın tek gerçek avantajı yazımının kısa olmasıdır; etkileşimli kabukta sık yazdığınız sabit bir komutu kısaltmak için idealdir. Argüman, koşul, döngü ya da betik içinde kullanım söz konusuysa fonksiyon yazın.
Tanımlı tüm alias'ları nasıl görürüm?
Argümansız alias ya da alias -p komutu hepsini, yeniden girdi olarak kullanılabilecek biçimde listeler. Bu çıktıyı bir dosyaya yönlendirip daha sonra source ile geri yükleyebilirsiniz.
Başka bir komutun argümanı olarak yazdığım alias neden genişlemiyor?
Alias yalnızca komutun ilk kelimesinde genişletilir; bir başka komutun argümanı olan kelime normalde denetlenmez. Önceki kelime değeri boşlukla biten bir alias ise bu kural değişir: o durumda kabuk bir sonraki kelimeyi de alias olarak dener. Yukarıdaki once2 örneği bu davranışı gösteriyor.
Alias neden betiğimde command not found veriyor?
Etkileşimsiz kabukta alias genişletmesi kapalıdır ve betik ~/.bashrc dosyasını da okumaz. Tanımı betiğe taşıyıp shopt -s expand_aliases ile açabilirsiniz, ama daha sağlam çözüm aynı işi fonksiyonla yapmaktır. Bu ve benzeri mesajların listesi Bash sık hata mesajları yazısında.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Bash öğrenme rehberi · Bash fonksiyon tanımlama · .bashrc ve .bash_profile farkı · shopt seçenekleri · tırnak farkları · komut geçmişi · source komutu · Linux sunucu komutları