在具有相同名称的 shell 函数中调用命令的最佳方法

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)