ksh93 หลีกเลี่ยงการส้อมในการทดแทนคำสั่งได้อย่างไร


12

ป.ร. ให้ไว้

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

หอยมีแนวโน้มที่จะต้องทำให้ 2 ส้อมเพื่อให้มันเกิดขึ้น

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

ยกเว้นkshอย่างกล้าหาญทำให้มันไม่ได้ฟอร์กครั้งเดียว:

dash    2
bash    2
zsh     2
ksh     0

มันทำอย่างไร


แก้ไข:

นี่คือวิธีที่มันจะลงไปด้วยไปป์:

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

เอาท์พุท:

dash    11
bash    10
zsh     5
ksh     3 

มันล้มเหลวไม่ได้จัดการสิ่งนี้สำหรับท่อทั้งหมด ฉันต้องการทำให้เรื่องนี้เป็นไปได้สำหรับท่อทั้งหมดอาจนำมันไปสู่เปลือกหอยอื่น ๆ
PSkocik

3
เพื่อตรวจสุขภาพจิตคุณkshติดตั้งมาหรือยัง? เมื่อฉันเรียกใช้รหัสของคุณฉันจะได้รับ0เปลือกใด ๆ ฉันไม่ได้ติดตั้ง
Eric Renouf

1
@EricRenouf ฮ่า ๆ ใช่ฉันทำ และมันก็ทำสิ่งต่าง ๆ เช่นกัน ;)
PSkocik

answerers อาจต้องการอ่านstackoverflow.com/questions/14686872
JdeBP

คำตอบ:


13

Ksh93 ทำสิ่งต่างๆมากมายเพื่อหลีกเลี่ยงการส้อม ฉันไม่รู้ว่าจะรู้ได้อย่างไรว่าจะจัดการกับกรณีแรกได้อย่างไรเนื่องจากเป็นการtrussแสดงให้เห็นว่าจะเรียกเพียงแค่หนึ่งwrite(2)สายที่มีผลลัพธ์สุดท้าย

อาจเป็นได้ว่าดาวิดสแกนคำสั่งใน macro.c และรู้ว่าเขาอาจจัดการ "echo" ภายใน

สิ่งที่ฉันสามารถพูดได้ก็คือฉันเขียน parser และล่ามของ "Bourne Shell" อีกครั้งในปีที่แล้วและลดจำนวนส้อมและเปลี่ยนส้อมโดยการvfork()โทรจำนวนมาก ปัจจุบันนี้ทำให้ Bourne Shell เป็นเชลล์ที่เร็วที่สุดอันดับสองที่ผ่านมา ksh93 คุณอาจต้องการทำการทดสอบด้วยboshเช่นกัน

BTW: ksh93 หลีกเลี่ยงส้อมโดยทั่วไป มันใช้โครงสร้างที่มีตัวแปรโกลบอลก่อนหน้านี้ทั้งหมดและทำให้เชลล์โค้ด reentrant หากถูกเรียกด้วยอินสแตนซ์ที่แตกต่างกันของตัวชี้โครงสร้างตัวแปร "โกลบอล"

ksh93 ใช้วิธีนี้เมื่อใดก็ตามที่มี(cmd)subshell

เหตุผลในการเขียนซ้ำนี้คือ David ใช้ Win-DOS บนแล็ปท็อปของเขาและเขาไม่ชอบ Cygwin ที่ช้าเขาจึงเขียน UWIN และใช้ ksh93 บน Win-DOS โดยตรง เนื่องจากไม่มีfork()ใน Win-DOS เขาจึงต้องหาโซลูชันใหม่ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.