Benzer bir komut dosyası var, sudo
ancak 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 sed
ile, dash
kabuk yorumladığını o.
strace
Bunlar üzerinde çalışan : dash
komut 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 sed
herhangi 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, read
yalnızca ilk satırsonu okuduğundan emin olmak zorundadır , böylece bir head
sonraki satırı görür. (Bu da işe dash
yarar.)
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. dash
yapmaz. zsh
Ve ksh93
Debian içinde paketlenmiş bu konuda Bash ile gidin.
sudo su
: unix.stackexchange.com/questions/218169/…