• フェッセンデンのエイリアス

PowerShellやbashなどのシェルにはエイリアス(Alias)という機能がある。これは、コマンドラインに別名を定義する機能だ。スクリプトと違って簡単な記述しかできない反面手軽で、シェルのメモリ中に置かれるため、ファイルを読み出して実行するスクリプトよりも高速だ。また、コマンドラインからも簡単に定義、削除が可能で一時的なものとしても利用できる。

コマンドラインのエイリアスは、1978年の2BSD(2nd Barkley Software Distribution)に付属したc shell(csh)が、始まりだとされている。cshは、Unix V6のshをベースに作られ、スクリプトの文法がC言語に準拠したことからその名がある。なお、Unix用の標準シェルであるBourne Shellも同じコードをベースに作られ、現在Linuxで広く使われているbashはこの後継である。なお、csh自体の開発は途絶えているが、上位互換性を持つtcshの開発は続いている。cshの特徴の1つは、対話型利用を便利する機能、ヒストリやエイリアス、ディレクトリのPush/Popなどが組み込まれた点だ。ヒストリやエイリアスを始め対話操作を便利にする機能は、その後、さまざまなシェルに取り込まれた。

ただし、cshのエイリアスでは、コマンド定義に“!”で始まるヒストリ参照を使って元のコマンド引数を扱うことができた(エイリアスで置換される前のコマンドを直前に実行したコマンドとして扱う)。これにより引数の並びを入れ替えるなどした複雑なエイリアスを定義することができた。

cshのエイリアスは便利すぎた反面、引数の記述が複雑(定義時にはヒストリ参照が置換されないようにエスケープする必要があった)で混乱もあった。このため、のちのシェルでは、引数を扱わない単純なエイリアスが採用され、引数を扱う場合には、スクリプトの使用が推奨されることになった。しかし、Unix/Linux系ではシェルのエイリアスの定義では、単なるオプション指定を行うことは可能だ。

たとえば、bashで


alias pgrep='grep -P'

とすると、pgrepというコマンド名で、Perl互換正規表現オプション(-P)を指定したgrepコマンドに置き換えが行われてから実行される。このとき、Ubuntu系では、すでに「alias grep='grep --color=auto'」が~/.bashrcの中にあるため、実際には、「grep --color=auto -P」が実行される。aliasの定義は、このように多重に解決されてから実行される。

aliasコマンド自体は、実行中のセッションでのみ有効であるため、いつも利用したければ、シェルの初期化スクリプト(.bashrcなど)の中に記述する。また、現在有効なエイリアスは、aliasコマンドを引数なしで実行すれば表示できる。同名のエイリアスを定義すれば上書きが行われ、unaliasコマンドを使うことで削除が行える。

PowerShellでは、さらに制限が強くなっていて、エイリアスは単純なコマンドの置換しか行わず、オプションなどの引数を含めることができない。

PowerShellでは、bashのpgrepの例のようにオプションを追加するだけの場合でも関数定義を行う必要がある。既存のコマンドに特定のオプションを追加したい場合、コマンドの引数を表す“@Args”を使う。エイリアスにしたいコマンドを関数で


function mygci { Get-ChildItem -Recurse @Args }

と定義しておく。以下のようなコマンドラインを実行すれば、


mygci -Filter *.txt | Select-String 'test'

mygciの引数(-Filter *.txt)を、関数内部のGet-ChildItemに@Argsで渡すことができる。

PowerShellはデフォルトのエイリアスが大量にあり、Get-ChildItemには“dir”のほか“ls”や“gci”(Get-ChildItemの略)などがある。少し迷惑なのは、curlやwgetといった著名プログラム名をInvoke-WebRequestのエイリアスにしていること、Where-Objectのエイリアスが“Where”になっていて、Windowsでコマンドパスを探すWhere.exeと衝突しているなどである。標準のエイリアス定義は修正されそうもないので、不要なエイリアスは起動時に実行されるプロファイルで消去しておくのも1つの手だ。PowerShell Ver.6以上ならRemove-Aliasが利用可能だが、Windows PowerShellでは「Remove-Item alias:<エイリアス名>」で削除する。

今回のタイトルネタは、エドモンド・ハミルトン(Edmond Moore Hamilton)の「フェッセンデンの宇宙」(1937年。原題Fessenden's World)である。なぜエイリアスと関係するのかというと、作品に登場する天才科学者「フェッセンデン」は、ヘテロダインの原理を考案し、世界初の無線音声通信を成功させた、カナダの天才発明家レジナルド・フェッセンデン(1866-1932。ハミルトンとほぼ同時代)から着想したと言われているからだ。コンピュータ・グラフィックスなどで使われる「アンチエイリアス」のエイリアスは、ヘテロダインで原理的に発生する「折り返し雑音(偽信号=alias)」の意味。