ทุกคำสั่งที่รันใน 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