同じ名前のシェル関数内でコマンドを呼び出す最善の方法

同じ名前のシェル関数内でコマンドを呼び出す最善の方法

私は同じ名前のシェル関数でコマンドをラップするのが好きです。ただし、シェル関数が再帰的に呼び出されるのを防ぐために、次の例のようにコマンドへのフルパスを指定します。

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/'
}

この問題を解決するための最良の方法は何ですか?
他のシェル関数名の使用を提案しないでください。

(主にこれを使用しますbashが、他のシェルソリューションにも興味があります。)

答え1

関数ではなく、実際のコマンドの前に組み込みシェルを追加すると、必要な操作がcommand正確に行われます。したがって、シェル関数は次のようになります。

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 はエイリアスで同じ名前のエイリアスを拡張しません。これは、「意図しない」ループを防ぐためです。

したがって、必要なコマンドを安全に実行できます。

alias ls="echo Hello; ls"

完全に大丈夫です。

関連情報