เป็น“ $” หรือไม่ (เครื่องหมายคำถามดอลลาร์) มีเฉพาะในเปลือก Bash เท่านั้น


10

ในBashเปลือกฉันสามารถรับสถานะออกจากคำสั่งผ่าน$?ตัวแปร:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0

มีเฉพาะใน Bash shell เท่านั้นหรือไม่ หรือฉันจะใช้มันในเปลือกหอยอื่นได้หรือไม่


8
คุณสามารถใช้มันใน POSIX เชลล์ใด ๆ มันเป็นหนึ่งในพารามิเตอร์พิเศษ
cuonglm

คำตอบ:


19

$?ทางออกรหัสเป็นธรรมดาที่จะเปลือกที่ตาม POSIX ใด ๆ และอธิบายไว้ใน2.5.2 พารามิเตอร์พิเศษ :

?
ขยายเป็นสถานะทางออกทศนิยมของไปป์ไลน์ล่าสุด (ดูที่Pipelines )


5
ไม่เพียง แต่ POSIX shell เท่านั้นเชลล์ที่เหมือน Bourne ทั้งหมดรวมถึง Bourne shell (ซึ่งฉันเชื่อว่าเป็นคนที่แนะนำมันเชลล์ Mashey มีตามที่$rฉันเชื่อ) ดังนั้นที่ดวลจุดโทษของแทบทุก Unix เหมือนระบบตั้งแต่ระบบปฏิบัติการยูนิกซ์ V7 ในช่วงปลายยุค 70 ส่วนใหญ่เปลือกหอยอื่น ๆ (csh, tcsh, ปลา, RC) $statusมีมันเป็น
Stéphane Chazelas

2
และภาษาสคริปต์หลายภาษา: Perl, Ruby, ฯลฯ
OrangeDog

13

โทมัสกล่าวว่าผ้ากันเปื้อนใด ๆ POSIX เชลล์ (ie. สวยมากทั้งหมดของพวกเขา) $?จะมี

คำถามนี้สนใจฉันไม่น้อยดังนั้นฉันทดสอบบนเปลือกใด ๆ ฉันจะได้รับในมือของฉัน:

  • mksh
  • zsh
  • /bin/sh บน Samsung Galaxy S5 ของฉัน
  • /bin/sh บนเราเตอร์ของฉัน
  • tcsh
  • ksh
  • dash
  • /bin/sh บน UNIX System V เสมือนของฉันตั้งแต่ปี 1989 หรือมากกว่านั้น
  • cmd.exeและpowershell.exeบนคอมพิวเตอร์ Windows 10 ของฉัน

และ$?ทำงานในสิ่งเหล่านี้ทั้งหมดยกเว้นfishและcmd.exe.

พบสองสิ่งที่น่าสนใจ:

1. $?ทำงานใน Windows PowerShell!

เอาล่ะถึงจุดหนึ่ง แทนที่จะกลับ 0 หรือจำนวนที่สูงขึ้นก็เพียงและTrueFalse

PS C:\WINDOWS\system32> echo $?
True
PS C:\WINDOWS\system32> gfdhgfhfdgfdg
gfdhgfhfdgfdg : The term 'gfdhgfhfdgfdg' is not recognized as the name of a cmdlet, ...(big long error output).....
PS C:\WINDOWS\system32> echo $?
False

2. ไม่ได้ทำงานในเปลือก$?fish

อย่างไรก็ตามเมื่อคุณพิมพ์$?ปลาคุณจะได้รับข้อความนี้:

~$ echo $?
$? is not the exit status. In fish, please use $status.
fish: echo $?

ฉันไม่ได้ใช้มันมาก แต่ฉันก็ไม่แปลกใจfishดูเหมือนว่าจะมีภาษาเชลล์ที่น่าสนใจแตกต่างไปจากbashหรืออะไรก็ตาม


หอยส่วนใหญ่ (ปลา, csh, tcsh, rc, zsh) ใช้$statusซึ่งเป็น IMO ที่ตรงไปตรงมา / ชัดเจนมากขึ้น เชลล์ที่มีลักษณะคล้ายบอร์นเท่านั้น (ในบรรดาเชลล์ Unix) ใช้$?AFAIK
Stéphane Chazelas

3
ขึ้นอยู่กับว่าคุณอ่านอย่างไร ฉันอ่านใจ$?ว่า "sh ## เกิดอะไรขึ้น" และหลังจากนั้นฉันไม่เคยลืมความหมายของตัวแปรพิเศษนี้ :)

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