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] $
答案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
。