スクリプトを実行するときにスクリプトからシェルエイリアスをエスケープするのは便利ですか?

スクリプトを実行するときにスクリプトからシェルエイリアスをエスケープするのは便利ですか?

bashソースではなく動作するシェルスクリプトでは、エスケープエイリアスは意味がありますか?


最も単純なケースを考慮すると、多くのユーザーがls機能をオーバーライドするために(inまたは)を使用します。たとえば、次のようになります。alias.bashrc.bash_aliases

alias ls='\ls --color=auto --group-directories-first'

次に、次の関数を含むシェルスクリプトを呼び出すとします。

list_sata_devices ()
{
    \ls -1 /dev/sd?
}

気づいたように強制的にオリジナル lsはい\ls、しかしこれが必要かどうか疑問に思います。


もちろんなくても書くことができますls。たとえば、次のようになります。

list_sata_devices ()
{
    printf '%s\n' /dev/sd?
}

しかし、どのような違いがあるかはまだ躊躇しています。

ベストアンサー1

alias ls='\ls --color=auto --group-directories-first'

バックスラッシュは必要ありません。シェルはそのようなマイナーなループに閉じ込められません。:

代替テキストの最初の単語はエイリアスがあるかどうかをテストしますが、拡張する単語と同じエイリアスを持つ単語は再び拡張されません。


次に、次の関数を含むシェルスクリプトを呼び出すとします。

list_sata_devices ()
{
    \ls -1 /dev/sd?
}

シェルスクリプト、つまり非対話型シェルの場合、その後、エイリアスはデフォルトで無効になります。:

シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しないと、エイリアスは拡張されません(Shoptの組み込みを参照)。

スクリプトはこれを明示的に有効にする必要があります(shopt -s expand_aliases) 下痢 何らかの理由でインタラクティブシェルに設定されたエイリアスを継承せず、非対話型シェルはたとえば読み取らないため、そこ.bashrcからインポートされません。非対話型シェルは次のファイルを読み込みます。$BASH_ENVそれでもそれにエイリアスを設定しない可能性があります。

したがって、ここでもバックスラッシュは必要ありません。


list_sata_devices ()
{
    printf '%s\n' /dev/sd?
}

まあ、別のコマンドです。実際には大きな効果はありませんが、ls端末に印刷すると、一部の特殊文字が異なるように処理されることがあります。

とにかくバッシュできる エクスポートと継承 機能環境によってはスクリプトがめちゃくちゃになることがありますが、一般的に誤ってそのようなことはしません。

おすすめ記事