คุณสามารถเขียนฟังก์ชันที่คืนค่าสถานะที่กำหนดเป็นอาร์กิวเมนต์หรือ255
ถ้าไม่มีให้ (ฉันเรียกมันret
ว่า "คืน" ค่าของมัน)
ret() { return "${1:-255}"; }
และใช้ในสถานที่ของการเรียกร้องให้ret
exit
นี่เป็นการหลีกเลี่ยงความไร้ประสิทธิภาพของการสร้างเชลล์ย่อยในคำตอบที่ยอมรับในปัจจุบัน
วัดบ้าง
time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'
บนเครื่องของฉันใช้เวลาประมาณ 3.5 วินาที
time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'
บนเครื่องของฉันใช้เวลาประมาณ 0.051 วินาทีเร็วกว่า 70 เท่า การใส่ค่าเริ่มต้นจะทำให้เร็วขึ้น 60 เท่า เห็นได้ชัดว่าห่วงมีค่าใช้จ่าย ถ้าฉันเปลี่ยนเนื้อความของลูปเป็นเพียง:
หรือtrue
จากนั้นเวลาจะลดลงครึ่งหนึ่งเป็น 0.025 ลูปที่ว่างเปล่าโดยสิ้นเชิงคือไวยากรณ์ที่ไม่ถูกต้อง การเพิ่ม;:
ไปยังลูปแสดงให้เห็นว่าคำสั่งขั้นต่ำนี้ใช้เวลา 0.007 วินาทีดังนั้นค่าใช้จ่ายในลูปจะอยู่ที่ประมาณ 0.018 การลบค่าใช้จ่ายนี้จากการทดสอบสองครั้งแสดงให้เห็นว่าการret
แก้ปัญหานั้นเร็วกว่า 100 เท่า
เห็นได้ชัดว่านี่คือการวัดสังเคราะห์ แต่สิ่งต่าง ๆ เพิ่มขึ้น หากคุณทำทุกอย่างช้ากว่าที่พวกเขาต้องการ 100 เท่าคุณจะต้องจบด้วยระบบช้า 0.0
exec exit 3
ไม่ใช่ bueno ฉันได้รับ"exec: exit: not found"