我需要拦截我在命令行上输入的每个命令,这样我就可以装饰他们。
例如,每当我输入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 只是一个使用 trapDEBUG
和PROMPT_COMMAND
环境变量实现的 shell 脚本。
有关DEBUG
陷阱的更多信息,请参阅命令的参考文档trap
:
有关PROMPT_COMMAND
环境变量的更多信息,请参阅 Bash 手册:
答案2
这是可以实现的兹什。 Zsh 是一种广泛使用的 shell,它使用的语言几乎是 bash 的超集,并且设计为具有高度可定制的 UI。
在 Zsh 中,您可以定义按下 Enter 键时要执行的任意函数。这可以对该行的内容执行任意操作。 (参见accept-line
小部件)。因此,一种解决方案是改用 Zsh。