【问题标题】:Record exit codes of all shell commands as they are executed记录所有 shell 命令执行时的退出代码
【发布时间】:2020-06-04 17:37:41
【问题描述】:

我想记录来自特定 TTY 的所有 shell 命令的退出代码,而不需要为每个命令附加语法。

例如:

> source solution.sh # sets up this bash session to monitor exit codes
> ls
> ls f
ls: f: No such file or directory
> echo "hello world"

某些文件会存储退出代码:

0
1
0

这可能吗?如果没有,我愿意接受其他可能完成类似任务的想法。

我的最终目标是收集关于我执行的所有命令及其退出代码的数据(有点像 ~/.bash_history 附加退出代码)

【问题讨论】:

  • 我想不出任何直接的方法来做到这一点。另外,如果您有一个带有子命令的命令,例如 if 块,您是否要保存子命令的退出代码以及整个块?
  • 你真正想用这个解决什么更大的问题?也许有更好的方法来实现它。
  • 考虑启用进程记帐。
  • 可能是调试陷阱?
  • 你能简单用吗:PROMPT_COMMAND='echo $? >> ~/exit-codes.log' ?

标签: bash shell unix exit-code


【解决方案1】:

感谢众多有用的 cmets,我得出了以下解决方案来记录 shell 命令执行时的退出代码:

  1. 使用陷阱调试:

    trap 'x=$?; $x >> ~/exit-codes.log' DEBUG
    
  2. 使用PROMPT_COMMAND

    PROMPT_COMMAND='x=$?; echo $x >> ~/exit-codes.log; (exit $x)'
    

    请注意,PROMPT_COMMAND 必须使用退出代码退出,以便跨 shell 命令保留退出代码历史记录。

  3. Process accounting 是一个更有原则的解决方案,但它需要sudo 访问才能启用。

我最终用来记录退出代码命令的solution.sh如下:

trap 'previous_exit_code=$?; previous_command=$this_command; \
  this_command=$BASH_COMMAND; [ ! -z "$previous_command" ] && \ 
  echo \"$previous_command\", $previous_exit_code >> ~/exit-codes.log' DEBUG

【讨论】:

  • 你可以写PROMPT_COMMAND='x=$?; echo $x >> ~/exit-codes.log; (exit $x)'来保留退出状态。
  • @chepner - 很好。除了简洁之外,使用 PROMPT_COMMAND 与陷阱 DEBUG 相比还有什么其他优势?
  • 真的不再简洁了;我只是使用较短的变量名:)
【解决方案2】:

最后的退出代码存储在$? 变量中。

但是你必须检查每个发出的命令,所以我猜仍然需要一些胶水来实现你的目标。

【讨论】:

  • 是的,胶水是我在这里试图弄清楚的部分。我已经根据 cmets 中的反馈发布了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多