PROMPT_COMMAND
如果设置,则在发出每个值之前将该值作为命令执行 主要提示。
我们有shell变量PROMPT_COMMAND
来指定在提示出现之前运行的命令,即恰好在我们输入的命令执行之后。
但是我没有找到我希望让我们在输入后立即运行命令的对应物,但在执行我们输入的命令之前。
有没有办法做到这一点?
答案 0 :(得分:2)
正如@storm所确定的,确实有一种方法可以解决您在问题中提到的特定功能。请参阅storm's answer。
您正在寻找的是一组“挂钩”,允许您向shell的不同部分添加功能。听起来很有趣,bash没有那么多。
PROMPT_COMMAND
的目的通常被认为是设置将由您的提示使用的内容。 This SO question有一些答案可以证明它可以用于此目的。当然,你可以将它用于其他事情(毕竟它是一个钩子),但事实是它在你的提示之前被执行与你的提示有关。
如果您决定陷阱DEBUG,您应该知道陷阱不会跟随您进入函数,但是函数中的陷阱集会跟随您回到调用shell:
$ function red { trap "echo world" DEBUG; echo "RED"; echo "RED"; }
$ function blue { echo "BLUE"; echo "BLUE"; }
$ trap "echo hello" DEBUG
$ red
hello
world
RED
world
RED
$ blue
world
BLUE
BLUE
如果您希望这样的陷阱是函数的本地陷阱,则必须将该函数定义为子shell,例如:
$ red() ( trap "echo world" DEBUG; echo "RED"; echo "RED" )
相当于:
$ function red { ( trap "echo world" DEBUG; echo "RED"; echo "RED" ); }
我没有在任何地方看到这种陷阱功能行为,这对我来说似乎有点接近。如果在未来版本的bash中改变它,我不会感到惊讶。
我不能代表Chet发言,但我怀疑我们会看到很多钩子功能被添加到bash 4.不知道未来版本的新功能可能是什么。
答案 1 :(得分:2)
您可以使用trap
man trap
命令
如果SIGNAL_SPEC是DEBUG,则在每个简单命令之前执行ARG。
这个想法很简单:如果你跑:
trap "echo command" DEBUG
然后Bash将在执行每个后续命令之前运行echo命令
~$ pwd
command
/home
~$ echo Bye
command
Bye
更多详情here。