あります同様の質問は、あなたが例えば交換したい「ラッピング」シナリオ、との取引cd
組み込みを呼び出すコマンドでcd
。
ただし、shellshockなどの観点から、bashが環境から関数をインポートすることを知っているため、いくつかのテストを行ったためcd
、スクリプトから組み込み関数を安全に呼び出す方法を見つけることができません。
このことを考慮
cd() { echo "muahaha"; }
export -f cd
この環境でを使用して呼び出されたスクリプトはすべてcd
破損します(などの影響を考慮してくださいcd dir && rm -rf .
)。
コマンドのタイプをチェックするコマンド(便利なtype
)と、関数ではなく組み込みバージョン(builtin
およびcommand
)を実行するコマンドがあります。しかし、見よ、これらも関数を使用してオーバーライドできます
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
以下を生成します。
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
環境全体をクリアせずに、bashに組み込みコマンドを安全に使用させる方法、または少なくともコマンドが組み込みコマンドではないことを検出する方法はありますか?
とにかく誰かがあなたの環境を制御しているなら、おそらくあなたはねじ込まれていると思いますが、少なくともエイリアスの場合は、その\
前にaを挿入することによってエイリアスを呼び出さないオプションがあります。
env
関数としても再定義されていない場合のみ。これは恐ろしいです。最初に、特殊文字が役立つと考えました-を含む完全なパスで呼び出す、ソースに/
使用.
するなど。しかし、それらは関数名にも使用できます!あなたは、することができますあなたが望む任意の関数を再定義し、それが元のコマンドを呼び出すに戻って取得するのは難しいです。
#/bin/sh
これがデフォルトの対話型シェルでない場合は、スクリプトを記述します。
env
、このように、前のコマンドを:env -i <SCRIPT.sh>