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。知道为什么吗?
$?已经扩展到。做,您会看到的。您必须使用单引号,或者像一样对其进行转义。0PS1echo $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。