Podobny skrypt bez sudo
, ale podobne wyniki:
$ cat script.sh
#!/bin/bash
sed -e 's/^/--/'
whoami
$ bash < script.sh
--whoami
$ dash < script.sh
itvirta
Z bash
, reszta skryptu idzie jako wejście do sed
, z dash
, na interpretuje ją powłoki.
Uruchamianie strace
na tych: dash
czyta blok skryptu (tutaj osiem kB, więcej niż wystarcza do utrzymania całego skryptu), a następnie odradza się 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|...
Co oznacza, że uchwyt pliku znajduje się na końcu pliku i sed
nie będzie widział żadnych danych wejściowych. Pozostała część jest buforowana wewnątrz dash
. (Jeśli skrypt był dłuższy niż rozmiar bloku 8 kB, pozostała część zostałaby odczytana sed
).
Bash natomiast stara się wrócić do końca ostatniego polecenia:
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|...
Jeśli dane wejściowe pochodzą z potoku, tak jak tutaj:
$ cat script.sh | bash
przewijanie nie jest możliwe, ponieważ rury i gniazda nie są widoczne. W takim przypadku Bash wraca do czytania jednego znaku na raz, aby uniknąć czytania. ( fd_to_buffered_stream()
ininput.c
) Wykonanie pełnego wywołania systemowego dla każdego bajtu nie jest w zasadzie bardzo skuteczne. W praktyce nie sądzę, aby odczyty były dużym narzutem w porównaniu np. Z faktem, że większość rzeczy, które wykonuje powłoka, obejmuje tworzenie nowych procesów.
Podobna sytuacja jest taka:
echo -e 'foo\nbar\ndoo' | bash -c 'read a; head -1'
Podpowłoka musi się upewnić, że read
czyta tylko pierwszą head
nową linię , aby zobaczyć następną linię. (To też działa dash
.)
Innymi słowy, Bash dokłada wszelkich starań, aby obsługiwać czytanie tego samego źródła dla samego skryptu i poleceń z niego wykonywanych. dash
nie. zsh
I ksh93
pakowany w Debianie iść z Bash w tej sprawie.
sudo su
: unix.stackexchange.com/questions/218169/…