我正在编写一个辅助脚本,该脚本需要在每个命令之后运行以分析其退出状态和输出日志。
我知道 stdout/stderr 缓冲区不存储在伪终端上。因此,我寻找一种方法,在执行每个命令之前将此输出“保存”到临时文件中,然后在执行完命令之后读取它。
以下是我添加到我的的内容.zshrc
:
LAST_OUTPUT_LOG_FILE="$HOME/zero.log"
exec 3>&1 1> >(tee $LAST_OUTPUT_LOG_FILE >&3)
# based on https://superuser.com/a/1111512/1748711
echo "Using $LAST_OUTPUT_LOG_FILE"
precmd () {
LAST_STATUS=$?
LAST_COMMAND=$(fc -ln -1)
echo "Last command: $LAST_COMMAND exited with status $LAST_STATUS"
echo "--------------- LAST COMMAND LOG $LAST_OUTPUT_LOG_FILE ---------------"
cat $LAST_OUTPUT_LOG_FILE
echo "--------------- LAST COMMAND LOG $LAST_OUTPUT_LOG_FILE ---------------"
# run my script here with the last command, its status and its output
# reset the log file
echo "" > $LAST_OUTPUT_LOG_FILE
}
除非我加载一个新终端并输入命令(比如说ls
)我收到以下错误:
precmd:echo:3: write error: broken pipe
precmd:3: write error: broken pipe
precmd:echo:4: write error: broken pipe
precmd:4: write error: broken pipe
precmd:echo:6: write error: broken pipe
precmd:6: write error: broken pipe
我试图实现的目标有可能实现吗?如果可以,我这里缺少什么?
干杯!
答案1
我在这里遗漏了什么?
使用以下方法检查代码ShellCheck – shell脚本分析工具:
$ shellcheck myscript
Line 2:
LAST_OUTPUT_LOG_FILE="~/zero.log"
^-- SC2088 (warning): Tilde does not expand in quotes. Use $HOME.
尝试修复它。