Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我可以对bash中输入的命令做出反应吗?_Linux_Bash_Shell_Interceptor_Prompt - Fatal编程技术网

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

Linux 我可以对bash中输入的命令做出反应吗?,linux,bash,shell,interceptor,prompt,Linux,Bash,Shell,Interceptor,Prompt,我希望以某种方式配置bash,以便在用户输入命令时做出反应。当他们按Enter键时,我希望我的bash运行我首先安装的脚本(类似于每次发出提示时运行的任何PROMPT\u命令)。这个脚本应该能够 看看输入了什么 也许可以改变它 甚至可能使shell忽略它(即使它不执行该行) 决定是否将文本插入历史记录 也许还有类似的事情 我还没有找到一个合适的方法来做这件事。我当前的实现都有缺陷,在执行命令之前使用调试陷阱进行干预,或者在命令执行完成后使用(HISTTIMEFORMAT='%s';histo

我希望以某种方式配置bash,以便在用户输入命令时做出反应。当他们按Enter键时,我希望我的bash运行我首先安装的脚本(类似于每次发出提示时运行的任何
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
及其功能的提示。它还有更多的方面,有时可能会派上用场,另一方面可能会成为一个问题,因为我真的不希望它们一直处于活动状态:-}