PATHの既存の関数と同じ名前で実行可能ファイルを実行する

PATHの既存の関数と同じ名前で実行可能ファイルを実行する

時には、実行可能ファイルを非表示にし、対応するパラメータまたは出力を調整する関数を定義します。したがって、関数は実行可能ファイルと同じ名前を持ち、関数を再帰的に呼び出さずに関数から実行可能ファイルを実行する方法が必要です。たとえば、fossil diff実行結果を自動化するには、次のようにcolordiffless -Rます。

function fossil () {
    local EX=$(which fossil)
    if [ -z "$EX" ] ; then
        echo "Unable to find 'fossil' executable." >&2
        return 1
    fi
    if [ -t 1 ] && [ "$1" == "diff" ] ; then
        "$EX" "$@" | colordiff | less -R
        return
    fi
    "$EX" "$@"
}

実行可能ファイルがどこにあるかわからない場合、/usr/bin/fossilBashは/コマンドが関数ではなく実行可能ファイルであることを意味すると思います。しかし、正確な場所がわからないので、which結果を確認するために電話をする必要がありました。より簡単な方法がありますか?

答え1

command内蔵シェルを使用してください。

bash-4.2$ function date() { echo 'at the end of days...'; }

bash-4.2$ date
at the end of days...

bash-4.2$ command date
Mon Jan 21 16:24:33 EET 2013

bash-4.2$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

答え2

スクリプトでは、この行はパスに基づいてbashコマンドを実行するために#!よく使用されます。/bin/env bash(一部のユーティリティでは異なる場合があります)。ここでも動作するはずです...

command代わりにも機能する必要がありますが、特定のシェルによって異なる/bin/command場合があります。)

/bin/commandどちらも/bin/envSUSに記載されているため、すべてのコンプライアンス実装にこれを含める必要があります。

答え3

Gertの答えはこの目的にも使用できることに気づきました。nice(実際にはすでにスクリプトに含まれていましたが、気付いていませんでした。)

$ function date() { echo 'at the end of days...'; }
$ date
at the end of days...
$ nice -n0 date
Mon Jan 21 16:45:21 CET 2013

他の答えほどエレガントではありませんが、状況によっては便利なオプションになる可能性があります。

関連情報