Dany
cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))'
pociski zwykle wymagają wykonania 2 widelców, aby tak się stało
strace-f(){ strace -f "$@" 2>&1; };
for sh in dash bash zsh ksh; do
printf "$sh\t" ; strace-f $sh -c "$cmd" |grep -e clone -e fork -c;
done
z wyjątkiem ksh
heroicznie czyni to bez rozwidlania się raz:
dash 2
bash 2
zsh 2
ksh 0
Jak to robi?
Edytować:
Oto, jak to idzie z wrzuconą rurą:
cmd='fun(){ echo "$@"| echo "$@"; }; fun $(fun $(fun hi))'
Wynik:
dash 11
bash 10
zsh 5
ksh 3
shell
ksh
command-substitution
fork
optimization
PSkocik
źródło
źródło
ksh
zainstalowany program do sprawdzania czystości psychicznej ? Kiedy uruchamiam twój kod, dostaję0
za każdą powłokę, której jeszcze nie zainstalowałemOdpowiedzi:
Ksh93 robi wiele, aby uniknąć widelców. Nie mam pojęcia, skąd wie, jak poradzić sobie z pierwszą sprawą, ponieważ
truss
pokazuje, że wywołuje tylko jednowrite(2)
połączenie z końcowym wynikiem.Możliwe, że David skanuje polecenie w makro.c i wie, że może wewnętrznie obsłużyć „echo”.
Mogę powiedzieć, że w zeszłym roku przepisałem parser i interpreter „Bourne Shell” i głównie zmniejszyłem liczbę widelców i zastąpiłem wiele z nich przez
vfork()
połączenia. To sprawia, że Bourne Shell jest drugą najszybszą powłoką po ksh93. Możesz również chcieć uruchomić swoje testybosh
.BTW: ksh93 ogólnie unika widelców. Implementuje strukturę, która zawiera wszystkie poprzednie zmienne globalne, dzięki czemu kod powłoki został ponownie wprowadzony, jeśli jest wywoływany z różnymi instancjami wskaźnika „globalnej” struktury zmiennej.
Ta metoda jest używana przez ksh93, ilekroć istnieje
(cmd)
podpowłoka.Powodem tego przepisywania jest to, że David używa Win-DOS na swoim laptopie i nie podobało mu się wolne Cygwin, więc napisał UWIN i używa ksh93 na Win-DOS bezpośrednio. Ponieważ nie ma
fork()
Win-DOS, musiał znaleźć nowe rozwiązanie ...źródło