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 (
~/.bashrcbash 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
cddeğiştirir (geçerli dizini setdeğiştirir, seçenekleri ve konum parametrelerini exportdeğ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 .
PATHOrtam 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ı aliasargü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, setyerleşik, değişkenlerin yanı sıra tanımlarıyla işlevleri de listeler. Bash, ksh veya zsh typeset -ffonksiyonları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 functionbelirli bir türdeki liste komutlarına. compgenYalnı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
PATHOrtam değişkeni içermiyor ~/dir-for-wat-command, compgen -cgö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.