Kabuğa yerleşik komutlar, bunun verdiği performans artışı nedeniyle genellikle yerleşiktir. Örneğin, harici çağrı yapmak printfyerleşik olanı kullanmaktan daha yavaştır printf.
Bazı yardımcı programlar olmadığından gerek , inşa edilecek onlar özel olmadıkça gibi cd, bunlar aynı zamanda sağlanmaktadır harici kamu hizmetleri. Bu, komut dosyalarının yerleşik bir eşdeğer sağlamayan bir kabuk tarafından yorumlanması durumunda kırılmayacağı şekildedir.
Bazı kabukların yerleşikleri, harici eşdeğer komutun uzantılarını da sağlar. Bash's printf, örneğin yapabilir
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
( /usr/bin/printfmevcut değişken oturumunda kabuk değişkenlerine erişimi olmadığından (ve bunları değiştiremediğinden) harici yapamayacağı (bir değişkene yazdırın ).
Yerleşik yardımcı programlar , genişletilmiş komut satırlarının belirli bir uzunluktan daha kısa olması gibi bir kısıtlamaya da sahip değildir . iş
printf '%s\n' *
bu nedenle printfbir kabuk yerleşik komutu ise güvenlidir . Komut satırının uzunluğundaki kısıtlama, execve()harici bir komut yürütmek için kullanılan C kitaplığı işlevinden gelir . Komut satırı ve geçerli ortam ARG_MAXbayttan büyükse ( getconf ARG_MAXkabuğa bakın), çağrı execve()başarısız olur. Yardımcı program kabuğun içine yerleştirilmişse, execve()çağrılması gerekmez.
Yerleşik yardımcı programlar, bulunan yardımcı programlara göre önceliklidir $PATH. Yerleşik bir komutu devre dışı bırakmak bashiçin örn.
enable -n printf
Bir kabuğa yerleştirilmesi gereken yardımcı programların kısa bir listesi vardır (POSIX standardının özel yerleşik listesinden alınmıştır )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Mevcut kabuk oturumunun ortamını ve program akışını doğrudan manipüle ettikleri için bunların oluşturulması gerekir. Harici bir yardımcı program bunu yapamaz.
İlginçtir, cdbu listenin bir parçası değildir, ancak POSIX bunun hakkında şunları söylüyor :
Yana cdgeçerli kabuk yürütme ortamı etkiler, her zaman yerleşik bir kabuk regular olarak sağlanır. Aşağıdakilerden biri gibi bir alt kabukta veya ayrı bir yardımcı program yürütme ortamında çağrılırsa:
(cd /tmp)
nohup cd
find . -exec cd {} \;
arayan ortamının çalışma dizinini etkilemez.
Bu nedenle cd, teoride "özel" yerleşiklerin harici muadilleri olamayacağını varsayıyorum (ancak çok fazla yapmaz).