ดูตัวอย่างต่อไปนี้และผลลัพธ์ใน POSIX เชลล์:
false;echo $?
หรือfalse || echo 1
:1
false;foo="bar";echo $?
หรือfoo="bar" && echo 0
:0
foo=$(false);echo $?
หรือfoo=$(false) || echo 1
:1
foo=$(true);echo $?
หรือfoo=$(true) && echo 0
:0
ตามที่ระบุไว้โดยคำตอบที่ได้รับการโหวตสูงสุดที่/programming/6834487/what-is-the-variable-in-shell-scripting :
$?
ถูกใช้เพื่อค้นหาค่าส่งคืนของคำสั่งที่เรียกใช้งานครั้งสุดท้าย
นี่อาจเป็นความเข้าใจผิดเล็กน้อยในกรณีนี้ดังนั้นขอนิยาม POSIX ซึ่งอ้างถึงในโพสต์จากกระทู้นั้น:
? ขยายเป็นสถานะทางออกทศนิยมของไปป์ไลน์ล่าสุด (ดูที่ Pipelines)
ดังนั้นดูเหมือนว่าการมอบหมายตัวเองนับเป็นคำสั่ง (หรือมากกว่าส่วนท่อ) ที่มีค่าศูนย์ทางออก แต่จะใช้ก่อนที่ด้านขวาของการมอบหมาย (เช่นการทดแทนคำสั่งเรียกในตัวอย่างของฉันที่นี่)
ฉันเห็นว่าพฤติกรรมนี้เหมาะสมจากมุมมองเชิงปฏิบัติ แต่ดูเหมือนว่าฉันค่อนข้างผิดปกติที่งานมอบหมายจะนับตามลำดับนั้น อาจจะชัดเจนมากกว่านี้ทำไมมันแปลกสำหรับฉันลองสมมติว่าการบ้านเป็นหน้าที่:
ASSIGNMENT( VARIABLE, VALUE )
แล้วfoo="bar"
จะเป็น
ASSIGNMENT( "foo", "bar" )
และfoo=$(false)
จะเป็นเช่นนั้น
ASSIGNMENT( "foo", EXECUTE( "false" ) )
ซึ่งหมายความว่าการEXECUTE
รันครั้งแรกและครั้งเดียวหลังจากนั้น ASSIGNMENT
จะทำงาน แต่ก็ยังคงEXECUTE
สถานะที่สำคัญที่นี่
ฉันถูกต้องในการประเมินของฉันหรือฉันเข้าใจผิด / ขาดอะไรไปหรือเปล่า? นี่คือเหตุผลที่ถูกต้องสำหรับฉันที่ดูพฤติกรรมนี้ว่า "แปลก" หรือไม่?
false;foo="bar";echo $?
กลับมาเป็น 0 เสมอเมื่อคำสั่งจริงล่าสุดที่รันคือfalse
" โดยพื้นฐานแล้วการบ้านนั้นมีพฤติกรรมพิเศษเมื่อพูดถึงรหัสทางออก รหัสการออกของพวกเขาคือ 0 เสมอยกเว้นเมื่อไม่ใช่เพราะสิ่งที่วิ่งเป็นส่วนหนึ่งทางด้านขวามือของการมอบหมาย