Eliah bunu cevaplamak için çok iyi bir iş çıkardı, ancak "neden echo
Bash programından ayrı bir versiyonu daha var " bölümü hakkında yorum yapmak istiyorum . Bu yanlış bir soru.
Doğru soru şudur: Neden bu bir ilk etapta yerleşiktir , ne zaman mükemmel bir dış komut olabilirdi (ve öyle)?
Basit olması için, tire içindeki bir ölçü birimi 38 olan bir basamağa bakın (bash çıktısına göre karşılaştırma için 61'e sahiptir compgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
Bunlardan kaç tanesinin yerleşik olması gerekir ? [
, echo
, false
, printf
, pwd
, test
, Ve true
yok ihtiyaç yerleşikleri olması: Sadece bir yerleşik yapabileceği bir şey yapmayın (etkileyebilir veya harici komutlara müsait değil iskelet durumunda elde). Bash en printf
azından bir yerleşik olmaktan yararlanıyor: printf -v var
çıktıyı değişkene kaydeder var
. time
bash'da ayrıca özeldir: bir anahtar kelime olarak, bash'ta rasgele komut listelerini zamanlayabilirsiniz (tire bir time
eşdeğeri içermez ). pwd
ya bir yerleşik olması gerekmez - herhangi bir harici komut geçerli çalışma dizinini miras alır (ve bu da bir harici komuttur ).:
bir istisnadır - bir NOP'a ihtiyacınız vardır ve :
öyledir. Geri kalan, harici bir komutun kolayca yapabileceği eylemleri yapar.
Bu nedenle, bu yerleşiklerin beşte birinin yerleşik olmaları gerekmez. Neden o zaman? Manpage * Aslında bu yerleşikleri (vurgu benim) neden geçerken açıklıyor:dash
yerleşikleri
Bu bölüm, yerleşik komutları listeler çünkü bunlar
Ayrı bir işlem tarafından gerçekleştirilemeyen bir işlem yapmanız gerekiyor.
süreci. Bunlara ek olarak, başka birçok komut da olabilir:
verimlilik için yerleşik olun (örneğin printf (1), echo (1), test (1), vb.)
İşte bu kadarı var: bu yerleşikler oradalar çünkü çok sık, etkileşimli ve betiklerde kullanılıyorlar ve işlevselliği kabuğun işi yapabilmesi için yeterince basit. Ve böylece olur: Bazı (? Çoğu) kabukları iş aldı ** geri gidin. Den 2,9 BSD ve bir bulamazsınız yerleşiğini.sh
echo
Bu nedenle, minimal bir kabuğun yerleşik komutlar gibi komutları uygulamayı geçmesi tamamen olasıdır. GNU coreutils projesi, onları belirli bir kabukta çalıştıracağınızı varsaymaz ve POSIX bu komutları gerektirir. Böylece, coreutils zaten bunları sağlar ve kabuğun dışında hiçbir anlamı olmayanları atlar.
* Bu, Debian Almquist kabuğunun dayandığı Almquist kabuğuna karşılık gelen manpage metni ile hemen hemen aynıdır .
** zsh
bu fikri en uç noktaya götürür: çeşitli modüller yükleyerek elde ettiğiniz komutlar zmv
, bir kabuğun içine girmesi gerektiğini düşünmeyeceğiniz şeylerdir . Bu noktada asıl soru şudur: neden tüm bu yerleşiklere sahip olan zsh yerine bash kullanıyorsunuz?