在执行之前捕获并修饰每个命令

在执行之前捕获并修饰每个命令

我需要拦截我在命令行上输入的每个命令,这样我就可以装饰他们。

例如,每当我输入echo Hi我真正想要执行的是/bin/wrapper "echo Hi".

除了重新编译之外,还有什么方法可以在 bash 中实现此目的吗?

编辑:另外,for _ in 1 2; do ping -c1 google.com; done必须成为/bin/wrapper "for _ in 1 2; do ping -c1 google.com; done"

答案1

你可以这样做bash 预执行

下载脚本:

wget 'https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh'

脚本来源:

source 'bash-preexec.sh'

现在,根据其使用说明

两个功能预执行预命令现在可以定义它们,如果它们存在,它们将被 bash-preexec 自动调用。

preexec在读取命令并即将执行后立即执行。用户键入的字符串作为第一个参数传递。

precmd在每个提示之前执行。相当于PROMPT_COMMAND,但更加灵活和有弹性。

您可以像这样使用它们:

preexec() { echo "just typed $1"; }

precmd() { echo "printing the prompt"; }

还值得一提的是,bash-preexec 只是一个使用 trapDEBUGPROMPT_COMMAND环境变量实现的 shell 脚本。

有关DEBUG陷阱的更多信息,请参阅命令的参考文档trap

有关PROMPT_COMMAND环境变量的更多信息,请参阅 Bash 手册:

答案2

这是可以实现的兹什。 Zsh 是一种广泛使用的 shell,它使用的语言几乎是 bash 的超集,并且设计为具有高度可定制的 UI。

在 Zsh 中,您可以定义按下 Enter 键时要执行的任意函数。这可以对该行的内容执行任意操作。 (参见accept-line小部件)。因此,一种解决方案是改用 Zsh。

相关内容