bash 命令事件(或 shell)

bri*_*ore 2 linux command-line shell bash

有没有办法捕获在 a 中执行的所有命令,bash甚至更好sh

我需要一个每次执行命令时都会调用的包装脚本。就像我键入时一样,我cd /home/希望command_wrapper.sh调用我的包装器脚本。在里面我想取消命令或调用另一个命令。

#!/bin/sh
#command_wrapper.sh

echo "you tried to call the command [$@]"
Run Code Online (Sandbox Code Playgroud)

如果仅在命令不存在时才调用脚本,那也没关系。这可能吗?

Chr*_*own 6

您可以使用DEBUG陷阱来做到这一点。在这个陷阱中,$BASH_COMMAND包含最后执行的命令。

trap 'echo "you tried to call the command [$BASH_COMMAND]"' DEBUG
Run Code Online (Sandbox Code Playgroud)

请注意,如果您将命令作为提示或的一部分执行$PROMPT_COMMAND,陷阱也会在这些命令上运行。您可以添加检查以查看是否与避免其中一些$BASH_COMMAND相同$PROMPT_COMMAND

至于在命令不存在时执行,在bash中,如果一个名为的函数command_not_found_handle存在,那么只要找不到命令,就会执行该函数。它使用您尝试执行的命令行中的所有参数作为参数执行,因此您可以执行以下操作:

command_not_found_handle() {
    echo "you tried to call the command [$@]"
}
Run Code Online (Sandbox Code Playgroud)

这导致:

$ foo bar
you tried to call the command [foo bar]
$
Run Code Online (Sandbox Code Playgroud)