Kabuğa yerleşik komutlar, bunun verdiği performans artışı nedeniyle genellikle yerleşiktir. Örneğin, harici çağrı yapmak printf
yerleş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/printf
mevcut 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 printf
bir 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_MAX
bayttan büyükse ( getconf ARG_MAX
kabuğ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 bash
iç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, cd
bu listenin bir parçası değildir, ancak POSIX bunun hakkında şunları söylüyor :
Yana cd
geç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).