程序执行后打印返回值

mr.*_*cky 9 command-line bash scripts

我想知道如何设置选项以在终端中的每个程序执行后自动打印返回值而不输入echo $?.

有什么可以设置的吗?代码块具有该功能。

Ser*_*nyy 10

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

方法一:

从 bash 手册页:

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.
Run Code Online (Sandbox Code Playgroud)

无论您将此变量设置为什么,都将在每次绘制提示之前运行。演示:

$> 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
$> 
Run Code Online (Sandbox Code Playgroud)

注意使用\$?. 如需永久更改,请将其保存在.bashrc

方法二

假设我的PS1提示是这样设置的:

PS1='
user@ubuntu:$> '
Run Code Online (Sandbox Code Playgroud)

如果我想在每次在屏幕上重绘此提示时运行某个程序(这是在每个前面的命令运行之后),我需要command substitution $(. . .) 像这样在提示中使用和设置它:

PS1=' [ $? ] 
user@ubuntu: $> '
Run Code Online (Sandbox Code Playgroud)

演示:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 
Run Code Online (Sandbox Code Playgroud)

请注意,我将 PS1 分成两行, top[ exitcode ]和 bottom $> <blank space>'。这就是为什么在第二行有>before $> '(前导>PS2多行命令的提示)。或者,您可以执行以下操作(注意$'...'结构):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
Run Code Online (Sandbox Code Playgroud)