シェルのエイリアス展開を無効化するには頭にbackslashをつける
bashなどでコマンドがエイリアス展開されるのを無効化するにはいくつか方法がある。
たとえばls
の場合、
/bin/ls
のように直接実行ファイルを指定する$(which ls)
のようにコマンド置換を経由して実行ファイルを指定するcommand ls
のようにシェルのビルトイン関数を経由する
といった方法がある。
ところが、実はコマンドの頭にbackslashをつけるだけでもエイリアス展開を無効化することができる。
$ \ls
POSIXシェルの仕様には次のように書かれている(強調は筆者による)。
2.2.1 Escape Character (Backslash)
A <backslash> that is not quoted shall preserve the literal value of the following character, with the exception of a <newline>. [...]
2.3 Token Recognition
4. If the current character is <backslash>, single-quote, or double-quote and it is not quoted, it shall affect quoting for subsequent characters up to the end of the quoted text. [...]
9. If the previous character was part of a word, the current character shall be appended to that word.
2.3.1 Alias Substitution
After a token has been delimited, but before applying the grammatical rules in Shell Grammar, a resulting word that is identified to be the command name word of a simple command shall be examined to determine whether it is an unquoted, valid alias name. [...]
2.6 Word Expansions
4. Quote removal (see Quote Removal) shall always be performed last.
2.6.7 Quote Removal
The quote characters ( <backslash>, single-quote, and double-quote) that were present in the original word shall be removed unless they have themselves been quoted.
つまり、上の例ではl
がクオートされているためエイリアス展開されずに処理が進み、最後にQuote Removalによりbackslashが取り除かれls
が実行される。
同様の理由により、下記の例はすべてエイリアス展開されずにls
が実行される。
$ l\s $ 'ls' $ 'l's $ l"s"
対話シェル上で一時的にエイリアス展開を無効化したいときに便利。