Bir kabuk dört çeşit komutu bilir.
- Takma adlar: Bunlar, bazı seçeneklere sahip bir komut için takma adlardır. Kabuğun başlangıç dosyasında (
~/.bashrc
bash için) tanımlanırlar.
- İşlevler: Bir isim verilen kabuk kod parçacıklarıdır. Diğer adlar gibi, kabuğun başlatma dosyasında tanımlanırlar.
- Yerleşikler: kabuk, az sayıda yerleşik komutla gelir. Çoğu yerleşik kabuk durumunu
cd
değiştirir (geçerli dizini set
değiştirir, seçenekleri ve konum parametrelerini export
değiştirir, ortamı değiştirir,…). Çoğu kabuk, büyük ölçüde aynı yerleşikleri sunar, ancak her kabuk, temel kümeye birkaç uzantıya sahiptir.
- Dış komutlar: kabuktan bağımsızdırlar. Diğer programlar gibi, kabuk da harici programları çalıştırılabilir arama yolunda arayarak yürütür .
PATH
Ortam değişkeni programları aramak için, iki nokta üstüste ayrılmış bir listesini içerir.
Aynı isimde birkaç tip komut varsa, yukarıdaki sıradaki ilk eşleşme gerçekleştirilir¹.
Bir adın ne tür bir komuta karşılık geldiğini çalıştırarak görebilirsiniz type some_name
.
Takma adı alias
argüman olmadan çalıştırarak takma adları listeleyebilirsiniz . Tüm mermilerde çalışan fonksiyonları veya yerleşikleri listelemenin bir yolu yoktur. Yerleşiklerin listesini kabuğun belgelerinde bulabilirsiniz.
Bash'ta, set
yerleşik, değişkenlerin yanı sıra tanımlarıyla işlevleri de listeler. Bash, ksh veya zsh typeset -f
fonksiyonlarını tanımlarıyla listeler. Bash'ta, herhangi bir türdeki tüm komut adlarını ile birlikte listeleyebilirsiniz compgen -c
. Sen kullanabilirsiniz compgen -A alias
, compgen -A builtin
compgen -A function
belirli bir türdeki liste komutlarına. compgen
Yalnızca bu önekle başlayan komutları listelemek için ek bir dize geçirebilirsiniz .
Zsh olarak, birlikte belirli bir türden mevcut komutları listeleyebilirsiniz echo ${(k)aliases}
, echo ${(k)functions}
, echo ${(k)builtins}
ve echo ${(k)commands}
(bu sonuncusu listeleri harici komutları için).
Aşağıdaki kabuk-agnostik snippet'i mevcut tüm harici programları listeler:
case "$PATH" in
(*[!:]:) PATH="$PATH:" ;;
esac
set -f; IFS=:
for dir in $PATH; do
set +f
[ -z "$dir" ] && dir="."
for file in "$dir"/*; do
if [ -x "$file" ] && ! [ -d "$file" ]; then
printf '%s = %s\n' "${file##*/}" "$file"
fi
done
done
Bash: hashed komutlarında bir uç vaka var.
Bash Referans El Kitabı diyor ki:
Dizinlerin $ PATH dizininde tam olarak aranması ancak komutun karma tablosunda bulunmaması durumunda gerçekleştirilir.
Deneyin:
set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat
PATH
Ortam değişkeni içermiyor ~/dir-for-wat-command
, compgen -c
göstermez wat
, ancak çalıştırabilirsiniz wat
.
Mevcut bir komutu gölgelendirmek istiyorsanız, takma ad veya işlev tanımlayın .
¹ İstisna: bazı yerleşikler ( özel yerleşikler denir ) bir işlev tarafından gölgelendirilemez - bash ve zsh varsayılan modda bu noktadaki POSIX ile uyumlu değildir.