Bagaimana cara ksh93 menghindari garpu dalam substitusi perintah

12

Diberikan

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

kerang cenderung perlu membuat 2 garpu untuk mewujudkannya

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

kecuali kshheroik membuatnya tanpa bercabang sekali:

dash    2
bash    2
zsh     2
ksh     0

Bagaimana cara melakukannya?


Edit:

Begini caranya turun dengan pipa dilemparkan ke dalam:

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

Keluaran:

dash    11
bash    10
zsh     5
ksh     3 
PSkocik
sumber
Gagal tidak mengelola ini untuk seluruh jaringan pipa. Saya ingin memungkinkan ini untuk seluruh jaringan pipa, mungkin membawanya ke kerang lain.
PSkocik
3
Hanya untuk pemeriksaan kewarasan, apakah Anda telah kshmenginstal? Ketika saya menjalankan kode Anda, saya mendapatkan 0shell apa pun yang tidak saya instal
Eric Renouf
1
@EricRenouf Lol, ya saya lakukan. Dan itu juga berfungsi. ;)
PSkocik
Penjawab mungkin ingin membaca stackoverflow.com/questions/14686872 .
JdeBP

Jawaban:

13

Ksh93 melakukan banyak hal untuk menghindari percabangan. Saya tidak tahu bagaimana ia tahu bagaimana menangani kasus pertama, karena trussmenunjukkan bahwa ia hanya memanggil satu write(2)panggilan dengan hasil akhir.

Mungkin saja David memindai perintah di macro.c dan tahu bahwa dia dapat menangani "echo" secara internal.

Apa yang dapat saya katakan adalah bahwa saya menulis ulang parser dan juru bahasa "Bourne Shell" tahun lalu dan terutama mengurangi jumlah garpu dan mengganti banyak garpu dengan vfork()panggilan. Ini saat ini menjadikan Bourne Shell shell tercepat kedua melewati ksh93. Anda mungkin ingin menjalankan tes boshjuga.

BTW: ksh93 menghindari garpu secara umum. Ini mengimplementasikan struktur yang berisi semua variabel global sebelumnya dan ini membuat kode shell reentrant jika dipanggil dengan contoh berbeda dari pointer struktur variabel "global".

Metode ini digunakan oleh ksh93 setiap kali ada (cmd)subkulit.

Alasan penulisan ulang ini adalah bahwa David menggunakan Win-DOS di laptopnya dan dia tidak menyukai Cygwin yang lambat, jadi dia menulis UWIN dan menggunakan ksh93 pada Win-DOS secara langsung. Karena tidak ada fork()pada Win-DOS, ia perlu menemukan solusi baru ...

schily
sumber