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

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

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

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

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

linux@linux$ hello
linux@linux$ 0

答案1

最后执行的命令的退出代码存储在$?环境变量中。因此,您只需将此变量添加到默认命令提示符中,即可始终在那里打印退出代码。提示符存储在环境$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

答案2

我选择的另一种方式Arch 维基使用方法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

$

答案3

这是一个简单的例子:

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确认 中没有硬编码值PS1

相关内容