如何在bash命令执行后自动运行脚本并获取刚执行的命令?
解决bash交互式终端自动捕获命令并执行脚本的问题
问题分析
你之前用PROMPT_COMMAND=('my_script.py "$(fc -l -1)"')失败的原因是:PROMPT_COMMAND在提示符显示前运行,此时刚执行的命令还未被写入历史记录,fc -l -1只能获取到上一次交互周期的命令;而history相关操作(如history -a)耗时过高,不符合你的需求。
可行方案
利用bash内置的BASH_COMMAND变量(存储当前正在执行的命令)结合trap DEBUG陷阱,无需依赖历史记录操作,即可高效捕获刚执行的命令:
- 在你的
~/.bashrc(或交互式shell的配置文件)中添加以下代码:
# 初始化变量存储最后执行的命令 LAST_COMMAND="" # DEBUG陷阱:在每个命令执行前,将当前命令存入变量(排除脚本自身执行的情况) trap '[[ "$BASH_COMMAND" != "my_script.py"* ]] && LAST_COMMAND="$BASH_COMMAND"' DEBUG # PROMPT_COMMAND:在提示符显示前,调用脚本并传递最后执行的命令 PROMPT_COMMAND='[[ -n "$LAST_COMMAND" ]] && my_script.py "$LAST_COMMAND"'
- 重载配置生效:
source ~/.bashrc
方案说明
BASH_COMMAND是bash内置环境变量,会实时存储当前正在执行的命令,无需读写历史文件,完全避免延迟问题。trap DEBUG会在每个命令执行前触发,我们用它将当前命令保存到LAST_COMMAND变量中,同时通过判断排除脚本自身的执行记录,避免循环触发。PROMPT_COMMAND在命令执行完成、提示符显示前运行,此时调用脚本并传递LAST_COMMAND,就能准确获取刚执行的命令(包括管道命令如foo | bar)。
内容的提问来源于stack exchange,提问作者meisel
相关产品推荐
相关产品推荐

