Bash 在执行命令之前调用函数

Bash 在执行命令之前调用函数,bash,Bash,提示命令 如果设置,则在发出每个命令之前,该值将作为命令执行 主要提示 我们使用shell变量PROMPT\u COMMAND来指定在PROMPT出现之前要运行的命令,也就是说,就在我们键入的命令执行之后 但我没有找到对应的命令,我希望它能让我们在按下enter键后立即运行命令,但在执行我们键入的命令之前运行 有什么方法可以做到这一点吗?正如@storm所指出的,对于您在问题中提到的特定功能,确实有一种方法可以做到这一点。看 看起来您正在寻找的是一组“挂钩”,允许您向shell的不同部分添加功能

提示命令

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

我们使用shell变量
PROMPT\u COMMAND
来指定在PROMPT出现之前要运行的命令,也就是说,就在我们键入的命令执行之后

但我没有找到对应的命令,我希望它能让我们在按下enter键后立即运行命令,但在执行我们键入的命令之前运行


有什么方法可以做到这一点吗?

正如@storm所指出的,对于您在问题中提到的特定功能,确实有一种方法可以做到这一点。看

看起来您正在寻找的是一组“挂钩”,允许您向shell的不同部分添加功能。虽然听起来很有趣,但bash并没有太多这样的功能

PROMPT\u命令
的作用通常被认为是设置提示符将使用的内容。有一些答案可以说明如何使用它。当然,您可以将它用于其他事情(毕竟它是一个钩子),但它在提示之前被执行的事实将它与提示联系起来

如果您决定使用陷阱进行调试,您应该知道陷阱不会跟随您进入函数,但函数中的陷阱集会跟随您返回调用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说话,但我怀疑我们是否会看到Bash4中添加了很多钩子功能。不知道未来版本中可能会有哪些新功能。

正如@storm所指出的,对于您在问题中提到的特定功能,确实有一种方法可以做到这一点。看

看起来您正在寻找的是一组“挂钩”,允许您向shell的不同部分添加功能。虽然听起来很有趣,但bash并没有太多这样的功能

PROMPT\u命令
的作用通常被认为是设置提示符将使用的内容。有一些答案可以说明如何使用它。当然,您可以将它用于其他事情(毕竟它是一个钩子),但它在提示之前被执行的事实将它与提示联系起来

如果您决定使用陷阱进行调试,您应该知道陷阱不会跟随您进入函数,但函数中的陷阱集会跟随您返回调用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说话,但我怀疑我们是否会看到Bash4中添加了很多钩子功能。不知道未来版本中可能会有什么新功能。

您可以使用
trap
命令,从
man trap

如果信号规格为DEBUG,则在每个简单命令之前执行ARG

这个想法非常简单:如果你跑步:

trap "echo command" DEBUG
然后Bash将在执行每个后续命令之前运行echo命令

~$ pwd
command
/home
~$ echo Bye
command
Bye

更多详细信息。

您可以使用
trap
命令,从
mantrap

如果信号规格为DEBUG,则在每个简单命令之前执行ARG

这个想法非常简单:如果你跑步:

trap "echo command" DEBUG
然后Bash将在执行每个后续命令之前运行echo命令

~$ pwd
command
/home
~$ echo Bye
command
Bye

更多详细信息。

您是否接受“不,没有”作为回答?:-)是的,有一个简短的为什么会很好。你会接受“不,没有”作为答案吗?:-)是的,有一个简短的“为什么”就好了!你赢了。我将删除我的答案。:-)@戈蒂,不,我读过你的答案,我喜欢。我同意@dotc你的答案似乎对OP有帮助。你可以编辑它并添加示例,我会测试这个命令,等我有时间的时候再编辑我的答案。DOH!你赢了。我将删除我的答案。:-)@戈蒂,不,我读过你的答案,我喜欢。我同意@dotc你的答案似乎对OP有帮助。你可以编辑它并添加示例,我会测试这个命令,等我有时间的时候再编辑我的答案。++对于函数,例如是的,'函数中的陷阱集跟随你回到调用shell'让我很困惑。你解释得很好,非常感谢。既然@storm给出了这个想法,我想把这归功于他。不过,我感谢你的回答。这非常有用。++对于函数来说,例如是的,'函数中的陷阱集跟随你回到调用shell'让我很困惑。你解释得很好,非常感谢。既然@storm给出了这个想法,我想把这归功于他。不过,我感谢你的回答。这很有帮助。