Eliah bunu cevaplamak için çok iyi bir iş çıkardı, ancak "neden echoBash 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 trueyok 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 printfazından bir yerleşik olmaktan yararlanıyor: printf -v varçıktıyı değişkene kaydeder var. timebash'da ayrıca özeldir: bir anahtar kelime olarak, bash'ta rasgele komut listelerini zamanlayabilirsiniz (tire bir timeeşdeğeri içermez ). pwdya 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.shecho
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 .
** zshbu 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?