Benzer bir komut dosyası var, sudoancak benzer sonuçlar yok:
$ cat script.sh
#!/bin/bash
sed -e 's/^/--/'
whoami
$ bash < script.sh
--whoami
$ dash < script.sh
itvirta
İle bash, senaryonun geri kalanı için girdi olarak gider sedile, dashkabuk yorumladığını o.
straceBunlar üzerinde çalışan : dashkomut dosyasının bir bloğunu okur (burada sekiz kB, tüm komut dosyasını tutmak için fazlasıyla yeterli) ve sonra ortaya çıkar sed:
read(0, "#!/bin/bash\nsed -e 's/^/--/'\nwho"..., 8192) = 36
stat("/bin/sed", {st_mode=S_IFREG|0755, st_size=73416, ...}) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|...
Bu, dosya tanıtıcısının dosyanın sonunda olduğu ve sedherhangi bir girdi görmeyeceği anlamına gelir . Kalan kısım içinde tamponlanır dash. (Komut dosyası 8 kB'lık blok boyutundan daha uzunsa, kalan kısım okunacaktır sed.)
Öte yandan Bash, son komutun sonuna geri döner:
read(0, "#!/bin/bash\nsed -e 's/^/--/'\nwho"..., 36) = 36
stat("/bin/sed", {st_mode=S_IFREG|0755, st_size=73416, ...}) = 0
...
lseek(0, -7, SEEK_CUR) = 29
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|...
Giriş bir borudan geliyorsa, burada olduğu gibi:
$ cat script.sh | bash
geri sarma yapılamaz, çünkü borular ve soketler aranmaz. Bu durumda, Bash, aşırı okunmasını önlemek için her seferinde bir karakter okumaya geri döner. ( fd_to_buffered_stream()İçindeinput.c her byte için tam sistem çağrısı yapmak) prensip olarak çok etkili değildir. Uygulamada, okumaların, kabuğun çoğu şeyin tamamen yeni süreçlerin ortaya çıkmasını içerdiği gerçeğine kıyasla büyük bir yük olacağını düşünmüyorum.
Benzer bir durum şudur:
echo -e 'foo\nbar\ndoo' | bash -c 'read a; head -1'
Alt kabuk, readyalnızca ilk satırsonu okuduğundan emin olmak zorundadır , böylece bir headsonraki satırı görür. (Bu da işe dashyarar.)
Başka bir deyişle, Bash, komut dosyasının kendisi ve ondan yürütülen komutlar için aynı kaynağı okumayı desteklemek için ek uzunluklara gider. dashyapmaz. zshVe ksh93Debian içinde paketlenmiş bu konuda Bash ile gidin.
sudo su: unix.stackexchange.com/questions/218169/…