oHo*_*oHo 3 shell function command
我喜欢使用相同的名称将命令封装在 shell 函数中。但是为了避免 shell 函数递归调用自身,我指定命令的完整路径作为以下示例:
less()
{
test 0 -lt $# && echo -ne "\e]2;$@\a\e]1;$@\a" # Window title
/usr/bin/less -i -rS --LONG-PROMPT --shift 5 "$@"
}
Run Code Online (Sandbox Code Playgroud)
但是对于某些命令,我不想指定路径,因为它可能会改变。我更愿意使用$PATH
.
例如,我的以下尝试无法mvn
使用反斜杠调用命令:\mvn
mvn() # colorizes maven output
{
\mvn "$@" 2>&1 | #here: the shell-function recursively calls itself indefinitely
sed -u '
s/^\[ALL\].*/\o033[1;37m&\o033[0m/
s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
s/^\[INFO\].*/\o033[1;37m&\o033[0m/
s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}
Run Code Online (Sandbox Code Playgroud)
绕过此问题的最佳方法是什么?
请不要建议使用不同的 shell 函数名称。
(我通常使用,bash
但我对其他 shell 解决方案感兴趣。)
小智 8
使用command
内置的 shell预先准备您的实际命令(而不是函数),它正是您正在寻找的目的。因此,您的 shell 函数应如下所示:
mvn()
{
command mvn "$@" 2>&1 |
sed -u '
s/^\[ALL\].*/\o033[1;37m&\o033[0m/
s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
s/^\[INFO\].*/\o033[1;37m&\o033[0m/
s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}
Run Code Online (Sandbox Code Playgroud)