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


14

この関数は、ユーザーの〜/ .bashrcのいずれかに存在します。

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

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

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

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

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

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

回答:


13

You can use command to circumvent the normal bash function lookup.

command rm

Non-destructive example:

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

Alternatively, call it using env (executing the first program with the given name on the $PATH, or by specifying the full path.

/usr/bin/env rm
/bin/rm

thanks, "command" is exactly what I'm looking for. It seems kind of obtuse to have to use for every system command executed though. I guess the only sure fire way to ensure you're running the system command is to specify the whole path. However, you're banking on the commands being in the same path across different distros at with that approach.
acm

@acm As I wrote, you can also go the env route. Additionally, you can determine each tool's location once and store it in a variable, e.g. RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. You could also change how your script is executed. Usually, functions and aliases aren't inherited, otherwise they'd break scripts all the time.
Daniel Beck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.