mattintosh note

田舎エンジニア物語 〜In Search of the Lost My Private Key〜

Bash alias の「A trailing space in value causes(末尾に空白があると)」って何?

久しぶりに 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 する。

Bash

linus@debian:~$ set +x

まず普通に空白を入れずに alias を定義する。そして定義したエイリアスエイリアスの引数として与える。

Bash

linus@debian:~$ alias list='ls'
+ alias list=ls
linus@debian:~$ list list
+ ls list
ls: 'list' にアクセスできません: そのようなファイルやディレクトリはありません

結果は最初のエイリアスだけ展開されて ls list になり「list なんてファイルは無いよ」となる。

続いて、値の末尾にスペースを入れて定義する。

Bash

linus@debian:~$ alias list='ls '
+ alias 'list=ls '
linus@debian:~$ list list
+ ls ls
ls: 'ls' にアクセスできません: そのようなファイルやディレクトリはありません

今度は list listls 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 のサンプルにはオプションもエイリアスとして使うような例が載ってるけど、オプション覚えたくないマンがやりそうなだけで使いやすいとは思わないな…。