Linux 我可以对bash中输入的命令做出反应吗?
我希望以某种方式配置bash,以便在用户输入命令时做出反应。当他们按Enter键时,我希望我的bash运行我首先安装的脚本(类似于每次发出提示时运行的任何Linux 我可以对bash中输入的命令做出反应吗?,linux,bash,shell,interceptor,prompt,Linux,Bash,Shell,Interceptor,Prompt,我希望以某种方式配置bash,以便在用户输入命令时做出反应。当他们按Enter键时,我希望我的bash运行我首先安装的脚本(类似于每次发出提示时运行的任何PROMPT\u命令)。这个脚本应该能够 看看输入了什么 也许可以改变它 甚至可能使shell忽略它(即使它不执行该行) 决定是否将文本插入历史记录 也许还有类似的事情 我还没有找到一个合适的方法来做这件事。我当前的实现都有缺陷,在执行命令之前使用调试陷阱进行干预,或者在命令执行完成后使用(HISTTIMEFORMAT='%s';histo
PROMPT\u命令)。这个脚本应该能够
- 看看输入了什么
- 也许可以改变它
- 甚至可能使shell忽略它(即使它不执行该行)
- 决定是否将文本插入历史记录
- 也许还有类似的事情
我还没有找到一个合适的方法来做这件事。我当前的实现都有缺陷,在执行命令之前使用调试陷阱进行干预,或者在命令执行完成后使用(HISTTIMEFORMAT='%s';history 1)
询问历史记录,了解命令启动时的情况等(但这只是事后诸葛亮,这并不是我真正想要的)
我期望类似于COMMAND\u INTERCEPTION
变量的东西,它的工作原理类似于PROMPT\u COMMAND
,但我找不到类似的东西
我也考虑过使用命令行完成来实现我的目标,但是没有找到任何关于发送一个完成的命令的反应,但也许我就是没有找到
感谢您的帮助:)您可以使用DEBUG
trap和,并从trap处理程序中查看BASH\u命令以查看正在运行的命令。(尽管如注释中所述,调试陷阱出现在每个简单命令上,而不是每个命令行上。子shell也会避开它。)
调试处理程序可以阻止命令运行,但不能直接更改它。当然,您可以在调试器中运行任何命令,可以使用BASH_command
和eval
构建它,然后告诉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上进行了测试。几天前,我发送了一个关于的问题的答案。我相信您可以在PS0
中“嵌入”您的操作。因此,这个链接可能会给你提供必要的启发(尽管我真的不确定“干预”、“交换输入命令”等,即如何使其工作。)PS0
,nice:)不幸的是,我的Ubuntu 16.04(最新的LTS版本)仍然包含一个没有该补丁的bash,所以它对PS0一无所知。另外,据我所知,PS0无法访问给定的命令,无法读取或更改它。不过还是要谢谢你在PS0上的提示!至少在将来的设置中,我可能会使用这个。所以,我想你的解决方案在某种程度上类似(但可能更复杂)。顺便说一句,我甚至没有注意到,PS0
是一个新的bash特性。谢谢,我又学到了一些新东西……PS0
是bash-4.4中新增的。\ls
或'ls'
或a=ls
等@gniourf\u gniourf或/bin/ls
?我没说这是不可能的。考虑到这是为了调试,而不是为了安全,我也不觉得有什么问题。没错,我对安全问题或沙箱什么都不感兴趣。我喜欢安慰我的工作。但另一个问题让我更为烦恼:如果我输入一个管道,如true | true | false | false
,那么该调试脚本将单独为管道的每个部分调用(每个true
调用一次,每个false
调用一次),甚至为我的提示符_命令调用一次。这有点问题,因为我无法通过自己执行某个命令来更改管道上下文中的命令。@Alfe,嗯,没错,文档说它会捕获每个简单命令,因此管道的每个部分都是独立的。如果您主要关心以交互方式输入的命令,那么最好查看readline和命令行编辑功能。但是我不确定能用它们做些什么,抱歉。:)无论如何,感谢extdebug
及其功能的提示。它还有更多的方面,有时可能会派上用场,另一方面可能会成为一个问题,因为我真的不希望它们一直处于活动状态:-}