bash脚本中PROMPT_COMMAND失效:如何在每条命令后执行指定函数
解决Bash脚本中PROMPT_COMMAND不生效的问题
我明白你遇到的困惑了——在非交互式的bash脚本里设置PROMPT_COMMAND完全没反应,对吧?其实这是个典型的特性场景误会:PROMPT_COMMAND是专为交互式shell设计的,也就是你平时打开终端手动敲命令的那种场景,它会在每次显示命令提示符之前触发执行指定内容。但脚本是以非交互式模式运行的,bash根本不会去读取这个变量,所以你的echo Yes完全没机会执行。
下面给你两种实用的解决方案,按需选择:
方案一:用DEBUG陷阱实现每条命令后执行函数
这是最推荐的脚本场景解决方案,利用bash的DEBUG陷阱特性,能自动在每条命令执行后触发自定义函数。
你可以把脚本改成这样:
#!/bin/bash # 定义你要在每条命令后执行的自定义函数 after_each_cmd() { echo "Yes" } # 设置DEBUG陷阱,让自定义函数在每条命令执行后运行 trap 'after_each_cmd' DEBUG # 你的业务命令 echo 1 echo 2
运行这个脚本后,输出会变成:
Yes 1 Yes 2
如果需要获取上一条命令的执行结果(比如退出码),还可以在函数里用$?调用:
after_each_cmd() { echo "上一条命令退出码:$?,已完成后续操作" }
方案二:强制脚本以交互式模式运行(不推荐)
如果你非要用PROMPT_COMMAND,可以让脚本强制跑在交互式shell环境下,只需要在shebang行加上-i参数:
#!/bin/bash -i PROMPT_COMMAND="echo Yes" echo 1
或者运行脚本时指定参数:bash -i your_script.sh
不过这种方式会带出来交互式shell的额外特性(比如显示终端提示符),会干扰脚本的纯净输出,所以只适合特殊场景使用。
内容的提问来源于stack exchange,提问作者Mr.SrJenea
相关产品推荐
相关产品推荐

