ทุกคำสั่งที่รันใน bash จะส่งคืนพร้อมโค้ดออก
เมื่อใดก็ตามที่ฉันพิมพ์คำสั่งบน bash prompt ฉันต้องการให้มันแสดงสถานะการออกเช่น echo $?
เช่นถ้าฉันใช้echo "hello";
bash prompt ผลลัพธ์ควรเป็น:
linux@linux$ hello
linux@linux$ 0
ทุกคำสั่งที่รันใน bash จะส่งคืนพร้อมโค้ดออก
เมื่อใดก็ตามที่ฉันพิมพ์คำสั่งบน bash prompt ฉันต้องการให้มันแสดงสถานะการออกเช่น echo $?
เช่นถ้าฉันใช้echo "hello";
bash prompt ผลลัพธ์ควรเป็น:
linux@linux$ hello
linux@linux$ 0
คำตอบ:
รหัสทางออกจากคำสั่งที่ดำเนินการครั้งสุดท้ายถูกเก็บไว้ใน$?
ตัวแปรสภาพแวดล้อม ดังนั้นคุณสามารถเพิ่มตัวแปรนี้ในพรอมต์คำสั่งเริ่มต้นและคุณจะพิมพ์รหัสทางออกที่นั่นเสมอ พรอมต์จะถูกเก็บไว้ใน$PS1
ตัวแปรสภาพแวดล้อม มันเป็นชุดแรกในสคริปต์และต่อมาใน/etc/bash.bashrc
$HOME/.bashrc
ดังนั้นแก้ไขบรรทัดใน$HOME/.bashrc
( /etc/bash.bashrc
จะเป็นทั้งระบบ) จากค่าเริ่มต้น:
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
ถึงสิ่งนี้ (ตัวอย่าง):
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '
ดังนั้นการแจ้งเตือนเริ่มต้นในเปลี่ยนเป็น:
user@host:/path/to/dir[0] $
0 ในวงเล็บคือรหัสออกของคุณดู:
user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $
สำหรับความหมายดูที่http://www.tldp.org/LDP/abs/html/exitcodes.html
readlink /proc/$$/exe
โปรดได้ไหม 0 หมายถึงไม่มีข้อผิดพลาดมีคุณพยายามบางสิ่งบางอย่างที่จะช่วยให้ข้อผิดพลาด: ^C
หรือfalse
หรือasdasdasd
?
PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")
แต่มันก็แสดงให้เห็น0
ตลอดเวลา มีความคิดอะไรบ้าง
$?
มีการขยายไปแล้วเมื่อตั้งค่าของคุณ0
PS1
ทำecho $PS1
และคุณจะเห็น \$?
คุณต้องใช้คำพูดอย่างใดอย่างเดียวหรือหนีมันเหมือน
อีกวิธีที่ฉันเลือกจากArch Wikiก็คือการใช้trap
:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
ผลกระทบ:
$ ( exit 1 )
code 1
$ some-non-existent-command
some-non-existent-command: command not found
code 127
$
นี่คือตัวอย่างง่ายๆ:
PS1='$? > '
หากใช้เครื่องหมายคำพูดคู่คุณต้องเพิ่มแบ็กสแลชเพื่อหลีกเลี่ยง$
:
PS1="\$? > "
เอาท์พุท:
0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 >
วิธีที่ดียิ่งขึ้นคือการพิมพ์รหัสทางออกเมื่อไม่ใช่ศูนย์
PS1='${?#0}> ' # single quote example
PS1="\${?#0}> " # double quote example (requires extra backslash)
ตัวอย่างผลลัพธ์:
> echo 'ok'
ok
> bogus
bogus: command not found
127>
คำอธิบาย: ${var#pattern}
เป็นการขยายพารามิเตอร์ bash ซึ่งหมายถึงลบรูปแบบการจับคู่ที่สั้นที่สุดออกจากส่วนหน้าของ $ var ดังนั้นในกรณีนี้เราจะลบออก0
จากด้านหน้าของ$?
ซึ่งจะตัดทอนรหัสออกของ0
ได้อย่างมีประสิทธิภาพ
หากใช้เครื่องหมายคำพูดคู่$?
จะถูกแทนที่เมื่อPS1
มีการตั้งค่าแทนที่จะได้รับการประเมินในแต่ละครั้ง ทำเพื่อยืนยันว่าคุณไม่ได้มีความคุ้มค่าในecho $PS1
hardcodedPS1