Answers:
最后执行命令的退出代码存储在$?
环境变量中。因此,您只需将此变量添加到默认命令提示符下,便会始终在其中打印退出代码。提示存储在$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] $
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
以确认你没有一个硬编码值PS1
。