このシェルスクリプトにバックスラッシュが含まれているのはなぜですか?

このシェルスクリプトにバックスラッシュが含まれているのはなぜですか?

私のスクリプトのコピーにはconda.sh次の行が表示されます。

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi

前にdバックスラッシュがある理由が気になりますdirname。私はそれが必要だとは思わない。これらのバックスラッシュの使用は、ソースファイルの他の場所でも発生します。私はこれを行う理由はありませんか?

ベストアンサー1

バックスラッシュはエイリアス拡張を抑制します。つまり、元のコマンドを実行し、エイリアスバージョンが実行されないようにします。システム設定shopt -s expand_aliases(BASHのみ)またはsource

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion

一部のシステム管理者は、エイリアスが誤って他の場所で使用され、エイリアスが前述のように拡張された場合に備えて、エイリアスの副作用に対する予防措置としてすべての項目にバックスラッシュを追加することを好みます。たとえば、システムがalias dirname='dirname -z'この値をどこかに設定し、条件が拡張エイリアスを許可している場合、残念ながらdirnameを呼び出そうとするスクリプトは、スクリプトが期待したものとは異なりdirname -zます。

そのようなエイリアスが存在しないと確信している場合は、すべてのバックスラッシュを削除すると正しく機能します。

または、commandバックスラッシュバージョンの代わりに使用してエイリアスを抑制することもできます。したがって、\dirname代わりにを使用すると、command dirname読みやすく見えます。 (などの組み込みコマンドではcdこれを使用する必要がありますbuiltin)。私はこの方法がエイリアスだけでなく同じ名前を持つ関数もバイパスするので、好みます。

おすすめ記事