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

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

我喜欢使用相同的名称将命令封装在 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 "$@"
}

但对于某些命令,我​​不想指定路径,因为它可能会改变。我更愿意使用$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/'
}

绕过这个问题的最佳方法是什么?
请不要建议使用不同的 shell 函数名称。

(我通常使用,bash但我对其他 shell 解决方案感兴趣。)

答案1

在您的实际命令(而不是函数)前面添加commandshell 内置命令,它正是您正在寻找的目的。因此你的 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/'
}

答案2

这取决于你使用什么外壳。默认情况下,zfs、bash和ksh不会在aliases中扩展与别名同名的别名。这是专门为了避免[通常是无意的]循环。

因此,您可以安全地发出您想做的命令。

alias ls="echo Hello; ls"

完全没问题。

相关内容