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


16

実行可能ファイルをシャドウイングし、その引数または出力を微調整する関数を定義することがあります。したがって、関数は実行可能ファイルと同じ名前を持ち、関数を再帰的に呼び出さずに関数から実行可能ファイルを実行する方法が必要です。たとえば、fossil diffthrough の出力を自動的に実行するにはcolordiff、次less -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/fossil。Bash /は、コマンドではなく、実行可能ファイルであることを認識しています。しかし、正確な場所がわからないwhichため、結果を呼び出して確認することに頼らなければなりません。もっと簡単な方法はありますか?


1
「Bash /は、コマンドが関数ではなく実行可能ファイルであることを認識しています」と言います。厳密に言えば、それは真実ではありません。私が恐ろしい(そして文書化されていない)設計上の決定だと信じていることにおいて、bashは関数名にスラッシュを含めることを許可します。スラッシュは、単に原因/usr/bin/fossil異なるように、文字列からfossilあなたが言うとき、そう、/usr/bin/fossilそれが実行しようとしないfossil機能を。
G-Manが「Reinstate Monica」と言う

回答:


19

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
もう1つのオプションは、コマンドをエスケープすること\dateです。
ヨルダン

4
@jordanm、エイリアスに対してのみ機能します。問題は機能に関するものでした。pastebin.com/TgkHQwbb
manatwork

3

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

command代替も動作するはずですが、特定のシェルに依存している可能性があります)(SolarisのBourneシェルで動作/bin/commandしますが、その場合は実際に実行され、Bashに組み込まれたシェルです)

両方/bin/command/bin/envすべての準拠した実装がそれを持っている必要がありますので、SUSに記載されています。


指摘してくれてありがとうenv。私はどちらの答えを受け入れるべきか疑問に思っていましたが、質問はbashに関するものなので、その組み込みcommandが最良の解決策です。
ペトルスキー-パドラック

1
私のLinuxでは何もありませんcommand実行可能ファイルは、しかしcommandまたで働くdashkshzsh。だから私はそれだけでなく、組み込みのシェルだと思いbashます。pastebin.com/fi3gyNse
manatwork

Solaris 10 Bourneのビルドインではありません(これはheirloom-shとしても利用可能です)。既知のパスを持つ実行可能ファイルの利点は、関数で上書きできないことです。
ゲルトヴァンデンバーグ

(/ bin / commandがないため、スクリプトが/bin/envシェルパスをハードコードしたくない場合に、ハッシュバンの後にスクリプトが使用される理由を説明できるかもしれません)
Gert van den Berg

3

Gertの答えはnice、その目的にも使用できることを実感させてくれました(実際にスクリプトの1つにそれを気づかずに持っていました)。

$ 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

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


これを拡張して、同様の代替手段を含めることもできます`which date`
エリアケイガン

1
@EliahKagan問題`which something`は、something実行可能ファイルがない場合、不幸なことが起こる可能性があることです。たとえば、if echoが欠落`which echo` /bin/rm preciousFileしている場合、意図したものとは非常に異なる何かをします。
ペトルプドラク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.