私は同じ名前のシェル関数でコマンドをラップするのが好きです。ただし、シェル関数が再帰的に呼び出されるのを防ぐために、次の例のようにコマンドへのフルパスを指定します。
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"
完全に大丈夫です。