我需要拦截我在命令行上输入的每个命令,以便我可以装饰它们。
例如,每当我输入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"
您可以使用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)
现在,根据其使用说明:
现在可以定义两个函数preexec和precmd ,如果它们存在,它们将被 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 手册: