Quantcast
Channel: mattintosh note
Viewing all articles
Browse latest Browse all 891

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

$
0
0

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


Viewing all articles
Browse latest Browse all 891

Trending Articles