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


21

conda.shスクリプトのコピーには、次の行があります。

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

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


回答:


30

バックスラッシュはエイリアスの展開を抑制します。つまり、元のコマンドを実行し、エイリアスバージョンが実行されないようにします。スクリプトは、システムが設定shopt -s expand_aliasesされてsourceいる場合(BASHのみ)、またはを使用して実行された場合に、知らないうちにエイリアス展開で実行できます。

./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て読みやすくすることができます。(などの組み込みコマンドの場合はcdbuiltin代わりに使用する必要があります)。代わりに同じ名前とエイリアスを持つ機能もバイパスするため、代わりにこれを好みます。


1
また、注目に値するのはunalias -a、すべてのエイリアスを削除することです。
Centimane

19
しかし、はい@Centimane行うことを確認して\unalias -a抑制エイリアス展開に
ベンC

sysadminも書いた/usr/bin/dirnameでしょうか?
ロンジョン

@RonJohnはい、彼はこの特定のケースで持つことができました。ただし、一部のプログラムでは、異なるディストリビューションが異なるディレクトリに配置します。頭に浮かぶインスタンスの1つは/bin/ed、Ubuntu /usr/bin/ed上とCentOS上です。完全なパスを指定すると、スクリプトの移植性が低下します。
doneal24

@ doneal24 エイリアスは表示されないDIRNAME=$(which dirname)ため、のようなものはどうwhichですか?
ロンジョン

20

conda.shソースとするファイルの場合、バックスラッシュはエイリアスをバイパスするためのものです。Bashは通常、スクリプト実行のエイリアス展開を無効にしますが、対話型シェルで実行される可能性のあるソースファイルの場合はそうではありません。ですからdirname、という名前のエイリアスを実行するだけですがdirname\dirnameエイリアスの展開をスキップして、という名前の関数またはコマンドを実行しますdirname。(ただし、バックスラッシュだけでなく、引用符で囲むこともできます。)


5
またはcommand dirname
クサラナナンダ

7
\command dirname、誰かが別名を作成した場合に備えcommandて。):|
muru

エイリアスをバイパスするのはなぜですか?この機能は何かの特殊なケースですか、それともbashにハードコードする必要がありますか(つまり、ハック)?
extremeaxe5

@ extremeaxe5 bashは、単語(の一部)が引用されている場合、エイリアス展開を行いません。
ムル

1
@ extremeaxe5機能がまったく存在しない理由を尋ねている場合、私は知りません。しかしこれはPOSIX標準にあります:「コマンド名の単語[...]を調べて、引用符で囲まれていない有効なエイリアス名であるかどうかを判断します」
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.