我可以对bash中的输入命令做出反应吗?

时间:2017-04-05 10:18:58

标签: linux bash shell interceptor prompt

我想以某种方式配置我的bash,以便我对用户输入命令的事件做出反应。他们按 Enter 的那一刻我希望我的bash能够运行我首先安装的脚本(类似于每次发出提示时运行的任何PROMPT_COMMAND)。这个脚本应该能够

  • 查看输入内容,
  • 也许改变它,
  • 甚至可能让shell忽略它(即使它不执行该行),
  • 决定文本是否应插入历史记录中,
  • 也许是类似的事情。

我还没有找到合适的方法来做到这一点。我当前的实现都是有缺陷的,并且在执行命令之前使用调试陷阱之类的东西进行干预,或者在命令执行完成后使用(HISTTIMEFORMAT='%s '; history 1)询问历史关于命令启动时的事情等(但这只是后见之明并不是我想要的事情。

我希望COMMAND_INTERCEPTION变量之类的内容与PROMPT_COMMAND类似,但我找不到类似的内容。

我还考虑使用命令行完成来实现我的目标但是却找不到任何关于在此发送完成命令的反应,但也许我还没有找到它。

任何帮助表示赞赏:)

1 个答案:

答案 0 :(得分:1)

您可以使用DEBUG陷阱和extdebug feature,并从陷阱处理程序中查看BASH_COMMAND以查看正在运行的命令。 (尽管如注释中所述,调试陷阱出现在每个简单命令上,而不是每个命令行。还有子shell无法实现。)

调试处理程序可以阻止命令运行,但不能直接更改它。当然,您可以在调试器中运行任何命令,可能使用BASH_COMMANDeval来构建它,然后告诉shell忽略原始命令。

这会阻止以ls开头的任何内容:

$ preventls() { case "$BASH_COMMAND" in ls*) echo "no!"; return 1 ;; esac; }
$ shopt -s extdebug
$ trap preventls DEBUG
$ ls -l
no!

使用trap - DEBUG删除陷阱。在Bash 4.3.30上进行了测试。