如何配置 bash 以打印每个命令的退出状态?

rav*_*xit 12 bash

在 bash 中运行的每个命令都会返回一个退出代码。

每当我在 bash 提示符下键入命令时,我都希望它显示退出状态,即, echo $?

例如,如果我echo "hello";在 bash 提示符下运行,输出应该是:

linux@linux$ hello
linux@linux$ 0
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 13

最后执行的命令的退出代码存储在$?环境变量中。因此,您只需将此变量添加到默认命令提示符即可,并且您将始终在那里打印退出代码。提示存储在$PS1环境变量中。它最初在/etc/bash.bashrc脚本中设置,后来在$HOME/.bashrc.

因此,从它的默认值编辑$HOME/.bashrc(/etc/bash.bashrc将是系统范围) 中的行:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Run Code Online (Sandbox Code Playgroud)

对此(例如):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '
Run Code Online (Sandbox Code Playgroud)

所以默认提示改为:

user@host:/path/to/dir[0] $
Run Code Online (Sandbox Code Playgroud)

括号中的 0 是您的退出代码,请参阅:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $
Run Code Online (Sandbox Code Playgroud)

含义见http://www.tldp.org/LDP/abs/html/exitcodes.html


mur*_*uru 7

我从Arch Wiki 中选择的另一种方法是使用trap

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Run Code Online (Sandbox Code Playgroud)

影响:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$
Run Code Online (Sandbox Code Playgroud)

  • 这并不完全符合 OP 的要求,因为即使退出状态为零,他也想打印退出状态——但这正是我一直在寻找的。 (2认同)