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

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

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

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

おすすめ記事