In che modo ksh93 evita le forcelle nella sostituzione dei comandi


12

Dato

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

le conchiglie tendono ad avere bisogno di fare 2 forchette per farlo accadere

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

tranne che ksheroicamente lo fa senza biforcarsi una volta:

dash    2
bash    2
zsh     2
ksh     0

Come lo fa?


Modificare:

Ecco come va giù con una pipa gettata dentro:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

Produzione:

dash    11
bash    10
zsh     5
ksh     3 

Tuttavia, non riesce a gestirlo per intere condutture. Vorrei renderlo possibile per intere condutture, portandolo prossimamente ad altri gusci.
PSkocik,

3
Solo per il controllo della sanità mentale, hai kshinstallato? Quando eseguo il codice ottengo 0per qualsiasi shell che non ho installato
Eric Renouf,

1
@EricRenouf Lol, sì, lo so. E fa anche cose. ;)
PSkocik,

I rispondenti potrebbero voler leggere stackoverflow.com/questions/14686872 .
JdeBP,

Risposte:


13

Ksh93 fa molto per evitare le forcelle. Non ho idea di come sappia gestire il primo caso, poiché trussdimostra che chiama solo una write(2)chiamata con il risultato finale.

È possibile che David esegua la scansione del comando in macro.c e sappia che può gestire "eco" internamente.

Quello che posso dire è che l'anno scorso ho riscritto il parser e l'interprete della "Bourne Shell", riducendo principalmente il numero di forchette e sostituito molte delle forchette con le vfork()chiamate. Questo attualmente rende la Bourne Shell la seconda shell più veloce dopo ksh93. Potrebbe anche essere utile eseguire i test bosh.

A proposito: ksh93 evita le forcelle in generale. Implementa una struttura che contiene tutte le precedenti variabili globali e ciò ha reso il codice della shell rientrante se viene chiamato con diverse istanze del puntatore della struttura delle variabili "globale".

Questo metodo viene utilizzato da ksh93 ogni volta che è presente una (cmd)subshell.

Il motivo di questa riscrittura è che David sta usando Win-DOS sul suo laptop e non gli è piaciuto il lento Cygwin, quindi ha scritto UWIN e usa direttamente ksh93 su Win-DOS. Non essendoci fork()su Win-DOS, aveva bisogno di trovare una nuova soluzione ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.