在命令执行之前调用函数

时间:2018-04-13 06:48:47

标签: bash

  

PROMPT_COMMAND

     

如果设置,则在发出每个值之前将该值作为命令执行   主要提示。

我们有shell变量PROMPT_COMMAND来指定在提示出现之前运行的命令,即恰好在我们输入的命令执行之后。

但是我没有找到我希望让我们在输入后立即运行命令的对应物,但在执行我们输入的命令之前

有没有办法做到这一点?

2 个答案:

答案 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