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

Giu*_*inò 5 bash

我需要拦截我在命令行上输入的每个命令,以便我可以装饰它们。

例如,每当我输入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"

iga*_*gal 3

您可以使用bash-preexec来完成此操作。

下载脚本:

wget 'https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh'
Run Code Online (Sandbox Code Playgroud)

脚本来源:

source 'bash-preexec.sh'
Run Code Online (Sandbox Code Playgroud)

现在,根据其使用说明

现在可以定义两个函数preexecprecmd ,如果它们存在,它们将被 bash-preexec 自动调用。

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

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

您可以像这样使用它们:

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

precmd() { echo "printing the prompt"; }
Run Code Online (Sandbox Code Playgroud)

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

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

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