วิธีการกำหนดค่า bash เพื่อพิมพ์สถานะทางออกสำหรับทุกคำสั่ง?


12

ทุกคำสั่งที่รันใน bash จะส่งคืนพร้อมโค้ดออก

เมื่อใดก็ตามที่ฉันพิมพ์คำสั่งบน bash prompt ฉันต้องการให้มันแสดงสถานะการออกเช่น echo $?

เช่นถ้าฉันใช้echo "hello";bash prompt ผลลัพธ์ควรเป็น:

linux@linux$ hello
linux@linux$ 0

สิ่งที่เกี่ยวกับการโพสต์คำถามของคุณในunix.stackexchange.com ?

ขอบคุณ @Frank แต่ไม่ใช่ที่ดีสำหรับการตั้งคำถามนี้หรือไม่?
ravidixit

ฉันลองพิมพ์มันเป็นส่วนหนึ่งของตัวแปร PS1 แต่ยังใช้งานไม่ได้ด้วยเหตุผลที่ฉันยังไม่เข้าใจ
ravidixit

คำตอบ:


13

รหัสทางออกจากคำสั่งที่ดำเนินการครั้งสุดท้ายถูกเก็บไว้ใน$?ตัวแปรสภาพแวดล้อม ดังนั้นคุณสามารถเพิ่มตัวแปรนี้ในพรอมต์คำสั่งเริ่มต้นและคุณจะพิมพ์รหัสทางออกที่นั่นเสมอ พรอมต์จะถูกเก็บไว้ใน$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


ฉันพยายามทำ แต่สำหรับมือทุบตีมันไม่ทำงาน มันจะแสดง [0] สำหรับเครื่องที่ฉันทำงานอยู่เสมอ
ravidixit

คุณแน่ใจหรือว่าคุณใช้ bash? คุณสามารถคัดลอกผลลัพธ์ของreadlink /proc/$$/exeโปรดได้ไหม 0 หมายถึงไม่มีข้อผิดพลาดมีคุณพยายามบางสิ่งบางอย่างที่จะช่วยให้ข้อผิดพลาด: ^Cหรือfalseหรือasdasdasd?
ความโกลาหล

1
@chaos ฉันมี PS1 ของฉันเป็นPS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")แต่มันก็แสดงให้เห็น0ตลอดเวลา มีความคิดอะไรบ้าง
สูงสุด

1
มันจะดีถ้าสถานะทางออกจะปรากฏเฉพาะถ้ามันไม่เท่ากัน 0
rubo77

1
@max มันเป็นเพราะคุณ$?มีการขยายไปแล้วเมื่อตั้งค่าของคุณ0 PS1ทำecho $PS1และคุณจะเห็น \$?คุณต้องใช้คำพูดอย่างใดอย่างเดียวหรือหนีมันเหมือน
wisbucky

7

อีกวิธีที่ฉันเลือกจาก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

$

2
แต่นั่นไม่ได้ค่อนข้างตอบสนองความต้องการของ OP เพราะเขาต้องการที่จะพิมพ์สถานะทางออกแม้ว่าจะเป็นศูนย์ - แต่มันว่าสิ่งที่ฉันได้รับการมองหา
Keith Thompson

2

นี่คือตัวอย่างง่ายๆ:

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


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