程序执行后打印返回值


9

我想知道如何在终端中的每个程序执行后将选项设置为自动打印返回值,而无需键入echo $?

是否可以设置?代码块具有该功能。

Answers:


10

是的,有两种方法。一个是设置PROMPT_COMMAND.bashrc,另-设置命令替换在PS1echo $?命令。

方法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 ] 
$> 

+1确实有效。我毫不怀疑任何信誉度为27k的人,但显然提示不是“命令”,因此使用$?它没有得到$?重置为零,就像我想的那样-即使使用第一种执行回声且没有错误的方法。

PS1只是在获得用户输入之前正在打印的文本,仅此而已。它不能不受参数扩展和命令替换的影响,因此您可以将任何内容放入$(...),例如$( pwd ),它将显示在那里。我已将其与自定义脚本结合使用来显示笔记本电脑的电池电量,例如
Sergiy Kolodyazhnyy

@mchid是什么意思?
Sergiy Kolodyazhnyy

1
@mchid“在发出每个主提示之前”,因此在最后一个命令执行完之后。
kos

1
@mchid会在打印提示之前运行-因此,在输入下一个命令之前。
大师

4

我从Arch Wiki中选择的一种方法是trap ERRtrap在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,以了解命令失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.