Answers:
是的,有两种方法。一个是设置PROMPT_COMMAND
在.bashrc
,另-设置命令替换在PS1
该echo $?
命令。
方法1:
从bash手册页:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
无论将此变量设置为什么,都将在每次绘制提示之前运行。演示:
$> PROMPT_COMMAND=" echo 'Last command exited with' \$? 'code' "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$>
注意的使用\$?
。要永久更改,请保存在.bashrc
方法2
假设我的PS1
提示设置如下:
PS1='
user@ubuntu:$> '
如果我想每次在屏幕上重绘此提示时(在每个前面的命令运行之后)都运行某些程序,则需要command substitution $(. . .)
像这样在提示中使用和设置它:
PS1=' [ $? ]
user@ubuntu: $> '
演示:
$> PS1=' [ $? ]
> $>_ '
[ 0 ]
$>_ ls /etc/passwd > /dev/null
[ 0 ]
$>_ ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
[ 2 ]
$>_
请注意,我将PS1分为两行,top将具有[ exitcode ]
and bottom $> <blank space>'
。这就是为什么在第二行>
之前有$> '
(前导>
是PS2
提示多行命令)的原因。或者,您可以执行以下操作(注意$'...'
结构):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
只是在获得用户输入之前正在打印的文本,仅此而已。它不能不受参数扩展和命令替换的影响,因此您可以将任何内容放入$(...)
,例如$( pwd )
,它将显示在那里。我已将其与自定义脚本结合使用来显示笔记本电脑的电池电量,例如
我从Arch Wiki中选择的一种方法是trap
ERR
。trap
在Bash中用于在收到信号或某些其他事件时运行命令。ERR
每当当前命令行以错误终止时,都会运行一个陷阱-返回值不为0。(如果它正常终止,则返回值显然为0。)
因此,例如:
trap 'printf "\ncode %d\n\n" $?' ERR
然后:
$ echo foo
foo
$ false
code 1
$
(注意:echo
成功运行的命令后没有消息- 输入命令而终端什么都不做是什么意思?)
Arch Wiki提示继续进行操作,并对消息进行了着色,以便您看到引人注目的黄色消息:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
影响:
实际上,我需要做的就是留意输出中的黄色code
,以了解命令失败。