ความหมายของ $ คืออะไร ในเชลล์สคริปต์?


คำตอบ:


43

$?ขยายเป็นสถานะออกของไปป์ไลน์เบื้องหน้าที่ดำเนินการล่าสุด ดูพารามิเตอร์ส่วนพิเศษของคู่มือการทุบตี

กล่าวง่ายๆคือสถานะการออกของคำสั่งสุดท้าย


26

คำตอบของ Cjmนั้นถูกต้อง แต่$?สามารถใช้ในรูปแบบที่โง่ในเชลล์สคริปต์และฉันต้องการเตือนต่อสิ่งนั้น สคริปต์เชลล์ที่ไม่ดีจำนวนมากมีรูปแบบของรหัสซ้ำ:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

หากเป็นไปได้ทั้งหมด (บางครั้งปัญหาเรื่องการอ่านอาจเกี่ยวข้องกับการบุกรุก) คุณควรเขียนโค้ดสถานการณ์นี้แตกต่างกัน:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

การใช้งานครั้งหลังนี้เร็วกว่าไม่ทำให้ตัวแปรเนมสเปซของเชลล์แปรผันกับจำนวนตัวแปรชั่วคราวที่สามารถอ่านได้มากขึ้นสำหรับมนุษย์และกระตุ้นให้ใช้ "ตรรกะเชิงบวก" การฝึกเขียนเงื่อนไขโดยไม่มีการปฏิเสธ ความเรียบง่ายในสถานการณ์ส่วนใหญ่ มันออกไปด้วยการใช้$?ส่วนใหญ่


5
จำเป็นต้องใช้ไวยากรณ์ที่ซับซ้อนยิ่งขึ้นเมื่อมีความเป็นไปได้มากกว่าแค่ 0 หรือ 1 - โปรแกรมมักจะสื่อสารข้อมูลที่เป็นประโยชน์ผ่านรหัสออก และยังมีประโยชน์หากคุณจำเป็นต้องใช้ค่านั้นอีกครั้งในภายหลังในรหัส (สำหรับการบันทึกเป็นต้น)
mattdm

3

นอกเหนือจากสิ่งที่cjm พูดว่าถ้าค่า$?เป็น 0 ดังนั้นกระบวนการก่อนหน้านี้จึงยุติโดยปกติ (หรือสำเร็จ) มิฉะนั้นจะเกิดข้อผิดพลาด


8
มันไม่ได้ส่งสัญญาณข้อผิดพลาดเสมอไป diffออกด้วย 0 หากไฟล์ที่เปรียบเทียบเป็นเหมือนกันโดยที่ 1 หากแตกต่างกันและ 2 เป็นข้อผิดพลาด
Shawn J. Goff

2
มันไม่เคยส่งสัญญาณข้อผิดพลาด มันเป็นเพียงสถานะทางออกของคำสั่งก่อนหน้า สิ่งที่ "0 ถ้าออกจากปกติ" เป็นข้อตกลง (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?- สถานะทางออกของคำสั่งสุดท้ายที่ดำเนินการ

$0- ชื่อไฟล์ของสคริปต์ปัจจุบัน

$#- จำนวนของอาร์กิวเมนต์ที่ส่งไปยังสคริปต์

$$- หมายเลขกระบวนการของเชลล์ปัจจุบัน สำหรับเชลล์สคริปต์นี่คือ ID กระบวนการที่พวกเขากำลังดำเนินการอยู่


0

$? แจ้งสถานะการดำเนินการของคำสั่ง execute ล่าสุดให้เราทราบ ค่า '0' แสดงว่าคำสั่งถูกเรียกใช้สำเร็จและ '1' ไม่ประสบความสำเร็จ


2
ไม่เพียง แต่ที่พร้อมต์แบบโต้ตอบ แต่ในสคริปต์ด้วยและค่าที่ไม่เป็นศูนย์จะบ่งบอกถึงความล้มเหลว
Kusalananda

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