W jaki sposób ksh93 unika rozwidleń podczas zastępowania poleceń


12

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 kshheroicznie 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 

To się nie udaje, ale nie radzi sobie z tym dla całych potoków. Chciałbym, aby było to możliwe dla całych rurociągów, prawdopodobnie przeniesie to do innych powłok.
PSkocik,

3
Czy masz kshzainstalowany program do sprawdzania czystości psychicznej ? Kiedy uruchamiam twój kod, dostaję 0za każdą powłokę, której jeszcze nie zainstalowałem
Eric Renouf,

1
@EricRenouf Lol, tak robię. I robi też rzeczy. ;)
PSkocik,

Odpowiedzi mogą chcieć przeczytać stackoverflow.com/questions/14686872 .
JdeBP

Odpowiedzi:


13

Ksh93 robi wiele, aby uniknąć widelców. Nie mam pojęcia, skąd wie, jak poradzić sobie z pierwszą sprawą, ponieważ trusspokazuje, że wywołuje tylko jedno write(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 testy bosh.

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 ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.