![程序执行后打印返回值](https://linux22.com/image/880112/%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E5%90%8E%E6%89%93%E5%8D%B0%E8%BF%94%E5%9B%9E%E5%80%BC.png)
我想知道如何设置选项以便在终端每次执行程序后自动打印返回值而无需输入echo $?
。
这是可以设置的东西吗?Codeblocks 有这个功能。
答案1
是的,有两种方法。一种是设置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 分成两行,顶部有[ exitcode ]
和 底部 $> <blank space>'
。这就是为什么第二行有>
之前$> '
(前导>
是PS2
多行命令的提示)。或者,您可以执行类似的操作(注意结构$'...'
):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
答案2
我从中挑选的方法Arch 维基是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
输出中的黄色以了解命令失败。