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


12

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

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

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

linux@linux$ hello
linux@linux$ 0

如何在unix.stackexchange.com上发布您的问题?

谢谢@Frank。但这不是提出这个问题的好地方吗?
ravidixit

我尝试将它作为PS1变量的一部分进行打印,但是由于我不了解的原因而无法使用。
ravidixit

Answers:


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 2013年

您确定要进行重击吗?可以复制readlink /proc/$$/exe请的输出吗?0表示没有错误,您是否尝试过会导致错误的内容:^Cfalseasdasdasd
2013年

1
@chaos我的PS1为PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"),但一直显示0。知道为什么吗?
最多

1
如果只显示退出状态(不等于0)
那就太好了

1
@max这是因为在设置时您$?已经扩展到。做,您会看到的。您必须使用单引号,或者像一样对其进行转义。0PS1echo $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的要求,因为他想打印退出状态(即使状态为零),但这正是我一直在寻找的东西。
基思·汤普森

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以确认你没有一个硬编码值PS1


感谢您从2018年1月开始。如果非零,我希望在正常提示时以退出代码开头-这很有帮助。
SDsolar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.