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 ksh
heroik 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
shell
ksh
command-substitution
fork
optimization
PSkocik
sumber
sumber
ksh
menginstal? Ketika saya menjalankan kode Anda, saya mendapatkan0
shell apa pun yang tidak saya instalJawaban:
Ksh93 melakukan banyak hal untuk menghindari percabangan. Saya tidak tahu bagaimana ia tahu bagaimana menangani kasus pertama, karena
truss
menunjukkan bahwa ia hanya memanggil satuwrite(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 tesbosh
juga.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 ...sumber