エスケープ後にエイリアスをスキップするのはなぜですか?

エスケープ後にエイリアスをスキップするのはなぜですか?

エイリアスをスキップする一般的な方法は、aliasコマンドの前にバックスラッシュを追加することです。例えば、

$ alias ls='ls -l'
$ ls file
-rw-r--r-- 1 user user 70 Jul 30 14:37 file
$ \ls file
file

私の研究を通して、、、、などl\s"ls"別名をスキップする他の素晴らしい方法を学びました。l""sls''

しかし、この動作はどこに文書化されていますか?つまり、これはなぜ正しい動作ですか?これPOSIX仕様前にバックスラッシュがあるときにエイリアスを無効にする特別なケースについては、文書化された文書はないようです。私も見つけることができません。マイシェルマニュアル

これは自分で答える質問です。

ベストアンサー1

キーは、シェル構文規則(セクション2.10)を適用する前に、シェルがエイリアス置換(セクション2.3.1)を実行することです。最初のステップはトークン認識(セクション2.3):

2.3トークン認識
トークンは、次のいずれかの規則に従ってトークンが分離されるまで、入力の現在の位置から開始する必要があります。トークンを構成する文字は、引用符で囲まれた文字を含む、入力の文字とまったく同じです。

(...トークン分離規則...)

トークンが区別されると、文法要件に従って分類されます。 シェル構文

2.3.1 エイリアスの置換
トークンが区切られた後、文法規則が適用される前に シェル構文、単純なコマンドとして認識されるコマンド名の単語の結果の単語が正しいことを確認する必要があります。引用しない、 有効なエイリアスです。

太字の部分を見ると、エイリアス照会フェーズに達するまで参照が削除されなかったという結論を下すことができます。 (バックスラッシュでエスケープするのも引用です。)

その後、\lsorを発行すると、シェルは正しいリテラル名であるか、またはでエイリアスをl\s探します。\lsl\sそのようなニックネームは可能ではありませんしたがって、エイリアス拡張は発生せず、シェルは文法規則に渡され、この時点で両方が私たちの長い友達として識別されますls。なぜなら」引用符のない<バックスラッシュ>は、後続の文字のリテラル値を保持する必要があります。」。 PATHシェル変数が一般変数の場合は、/bin/lsこのオプションを使用せずに実行します-l

"ls"これは、、、、、...エイリアスをスキップする理由も説明します'ls'l""sl''s

おすすめ記事