![在终端中的每个命令后打印退出状态代码](https://linux22.com/image/206259/%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E7%9A%84%E6%AF%8F%E4%B8%AA%E5%91%BD%E4%BB%A4%E5%90%8E%E6%89%93%E5%8D%B0%E9%80%80%E5%87%BA%E7%8A%B6%E6%80%81%E4%BB%A3%E7%A0%81.png)
我想在 zsh 退出代码值中打印每个启动的命令。例如
$ cat file_not_present
cat: file_not_present: No such file or directory
Exit code 1
我只知道我可以打印在终端中启动的最后一个命令的错误代码
$ echo $?
我能怎么做?
答案1
就我个人而言,我添加%(?..%B(%?%)%b)
到 my $PROMPT
,以便上一个命令的退出状态在不成功的情况下以粗体显示在括号中,这比打印每个命令的退出状态更少干扰。
打印每个的退出状态失败命令,你可以这样做:
TRAPERR() print -u2 Exit status: $?
$假;错误的; (123号出口) 退出状态:1 退出状态:1 退出状态:123 (123)$
((123)$
来自$PROMPT
上面提到的存在)。
对于每个命令:
TRAPDEBUG() print -u2 Exit status: $?
但这可能会变得非常烦人。
您还可以打印最后运行的命令的退出状态:
print_last_status() print -u2 Exit status: $?
precmd_functions+=(print_last_status)
$ false; (exit 123); true
Exit status: 0
与该$PROMPT
方法一样,您只能看到在上一个提示符下发送的命令行中运行的最后一个命令的状态。
无论如何,在 stderr 上打印它(正如我上面使用 所做的那样-u2
)可能会比在 stdout 上打印它引起的问题更少。做起来print Exit status: $? > /dev/tty
可能会更好。
答案2
您可以将任何用户定义的函数添加到precmd_functions
:
print_status() echo $?
precmd_functions+=(print_status)
它在每个提示之前执行,即在命令之后执行。
答案3
在 zsh 中,您可以使用precmd
钩子并执行类似的操作(取自这个答案):
% PROMPT_COMMAND='printf "Exit code: %s\n" $?'
% precmd() { eval "$PROMPT_COMMAND" }
% cat file_not_present
cat: file_not_present: No such file or directory
Exit code: 1
在 bash 中,您可以使用该PROMPT_COMMAND
变量:
$ PROMPT_COMMAND='printf "Exit code: %s\n" $?'
$ cat file_not_present
cat: file_not_present: No such file or directory
Exit code: 1