如何实现类似PROMPT_COMMAND的功能 用于非交互Bash脚本逐行执行指定命令
Bash非交互脚本实现每行执行后自动运行指定命令的方案
你要的功能可以通过Bash内置的DEBUG信号陷阱配合extdebug选项实现,完全适配非交互脚本场景,以下是可直接复用的实现:
完整实现代码
#!/bin/bash # 定义你需要的thingcom命令 thingcom() { # 无参数传入时取消自动执行逻辑 if [[ -z "$1" ]]; then trap - DEBUG shopt -u extdebug return 0 fi # 开启extdebug选项,保证陷阱逻辑在所有命令场景下生效 shopt -s extdebug # 绑定DEBUG陷阱:先执行当前行原命令,再执行你传入的自定义命令,返回1跳过原命令默认执行避免重复运行 trap 'eval -- "$BASH_COMMAND"; '"$1"'; return 1' DEBUG }
效果演示
对应你给出的示例,运行逻辑如下:
# 未开启thingcom时的正常执行 echo hel echo hel echo hel echo hel # 配置后续每行命令执行后自动sleep 1 thingcom "sleep 1" echo hel sleep 1 echo hel sleep 1 echo hel sleep 1 echo hel sleep 1 # 随时可以取消自动执行 thingcom ""
注意事项
- 仅支持Bash 4.0及以上版本
- 自动执行的命令请避免修改
BASH_COMMAND内置变量,否则会导致原命令执行异常 - 如果你的脚本本身已经使用了
DEBUG陷阱,该实现会覆盖原有陷阱逻辑
内容的提问来源于stack exchange,提问作者lnee_94
相关产品推荐
相关产品推荐

