久しぶりに Bash のマニュアルを読む機会があって alias
について読んでたら謎いことが書いてあった。
alias コマンドを引き数を付けずに (あるいは -p オプションを付けて) 実行すると、エイリアスのリストが 「alias name=value」の形で標準出力に出力されます。引き数を与えた場合には、value を与えられた name それぞれに対するエイリアスが定義されます。value の末尾に空白があると、エイリアスが展開されたときに、空白の次の単語についてエイリアス置換があるかどうか調べられます。引き数リスト中に value が与えられていない name があった場合は、それぞれに対して名前とエイリアスの値が出力されます。エイリアスが定義されていない name が指定された場合以外は、alias は真を返します。
何言ってんだこいつ?と思ったけど Wikipedia 見たらわかった。
https://en.wikipedia.org/wiki/Alias_(command)#Chaining
Bash のバージョンは下記の通り。
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
xtrace を有効にしておくとわかりやすいので set -x
する。
linus@debian:~$ set +x
まず普通に空白を入れずに alias
を定義する。そして定義したエイリアスをエイリアスの引数として与える。
linus@debian:~$ alias list='ls' + alias list=ls linus@debian:~$ list list + ls list ls: 'list' にアクセスできません: そのようなファイルやディレクトリはありません
結果は最初のエイリアスだけ展開されて ls list
になり「list
なんてファイルは無いよ」となる。
続いて、値の末尾にスペースを入れて定義する。
linus@debian:~$ alias list='ls ' + alias 'list=ls ' linus@debian:~$ list list + ls ls ls: 'ls' にアクセスできません: そのようなファイルやディレクトリはありません
今度は list list
が ls ls
に展開された。これが 空白の次の単語についてエイリアス置換があるかどうか調べられます
ということなんだろう。
コマンドの先頭のエイリアスを他のコマンドに変えても同じように末尾にスペースがあればその次がエイリアスだった場合は展開される。
linus@debian:~$ rm list + rm list rm: 'list' を削除できません: そのようなファイルやディレクトリはありません linus@debian:~$ alias rm='rm ' + alias 'rm=rm ' linus@debian:~$ rm list + rm ls rm: 'ls' を削除できません: そのようなファイルやディレクトリはありません
空白の次の単語についてエイリアス置換があるかどうか調べられます
というか「空白の次の単語についても展開されます」って言う方が妥当なのでは?と思う。(調べるというかそのときにはもうコマンドに引数として渡してしまってるわけで…)
Wikipedia のサンプルにはオプションもエイリアスとして使うような例が載ってるけど、オプション覚えたくないマンがやりそうなだけで使いやすいとは思わないな…。