web-dev-qa-db-ja.com

システムコマンドと同じ名前のユーザー定義関数をオーバーライドする

この関数は、私のユーザーの〜/ .bashrcの1つに存在します。

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

ユーザーが実行する必要がある私のkshスクリプトには、次のような行があります。

[[ "$KEEP" = "" ]] && \rm $FILE

バックスラッシュはユーザー定義のエイリアスをエスケープしますが、スクリプトが同じ名前のユーザー定義関数を実行するのを停止しません。その結果、システム関数の代わりにユーザーのrm()関数が呼び出されます。

this スーパーユーザーの質問の質問と応答が見つかりましたが、解決策は組み込み関数にのみ適用され、システムコマンドには適用されません。

エイリアスや関数ではなく、rmコマンドが呼び出されないようにするのに最適な方法は何ですか? rmへのフルパスを指定する必要があり、確認したいすべてのシステムコマンドが正しく実行されますか?もっと良い方法はありますか?

14
acm

commandを使用して、通常のbash関数ルックアップを回避できます。

command rm

非破壊的な例:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

または、envを使用して呼び出します($PATHで指定された名前の最初のプログラムを実行するか、フルパスを指定します。

/usr/bin/env rm
/bin/rm
13
Daniel Beck