fortuneコマンドについての雑記

UNIXのおみくじコマンド

fortuneコマンドは、実行すると、あらかじめ用意された気の利いた文句や冗談、偉人の名言などの中から一文をランダムに表示するコマンドだ。オリジナルのfortuneコマンドは、ランダムで面白い文章を結果として出力する事から、昔からUNIXユーザの間で親しまれてきた「おみくじ」、最近の流行で言うと、組み合わせた文章を表示させる事こそ出来ないが「診断メーカー」のような存在と言ってもよさそうだ。

特に利用目的に制限はないのだが、通常、fortuneコマンドはシステムへのログイン時*1に実行される。以下は、職場のマシンから自宅のDebianサーバにログインした時の出力例である。

Using username "user".
user@example.com's password:
Linux alice 2.6.25.1-kuroboxHG #9 Sun May 4 21:29:57 JST 2008 ppc GNU/Linux
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Apr 23 09:01:54 2010 from 210.226.XXX.XXX
「再帰」を定義するには、我々は最初に「再帰」を定義しなければならない。
user@alice:~$

ログイン画面のMOTDの次にfortuneコマンドによるメッセージが表示される。表示させるメッセージ集は、様々なところで公開・配布されている。大半が英語なので、自分の場合は「コンピュータ・ジョーク」や「真・コンピュータ用語辞典」の冗談を中心に借用している。

フォーチュン・クッキー

f:id:dyama:20100423105010j:image:right

このコマンドに関する海外の文献では、「fortuneコマンドの元となったのは中華料理店で出されているフォーチュン・クッキーである」と、書かれている事が多い。それらの邦訳であっても、大抵の場合直訳であって、それ以上の事は書いていない為、我々日本人も「フォーチュン・クッキーとは、中国の焼き菓子なのかあ・・・」なんて考えてしまいそうだ。

しかし、そのルーツは中国ではなく日本にあった。

Wikipedia のフォーチュン・クッキーの項目には以下のような記述がある。

フォーチュン・クッキー (fortune cookie) とは、中に運勢の書かれた紙片の入った菓子である。アメリカ合衆国・カナダの中華料理店では殆どの店で食後に出される。

日本の北陸地方の神社で新年の祝いとして配られていた辻占煎餅に由来するもので、形は辻占煎餅そのままである。

1894年、サンフランシスコのゴールデン・ゲート・パークで開催された国際見本市(California Midwinter International Exposition)で、日本庭園を設計し、運営していた萩原は、煎餅(英語ではJapanese cookieという)を二つ折りにしてその中に言葉を書いた紙を入れたものを、店を訪れる客にお茶請けとして出した。幾つかの中華料理店がこの煎餅を取り入れ、フォーチュン・クッキーは非常に一般的なものとなった。現在では多くの飲食店で、食事後の口直しとしてフォーチュン・クッキーが出されるようになった。

上記の様な経緯から、中国の習慣であると誤認しているアメリカ人も少なくない。しかし中国ではフォーチュン・クッキー自体知られていない。

(一部抜粋)

北陸のおみくじ煎餅が100年以上前に海を渡り、北米ローカルの中華料理店のメニューとなり、さらにはUNIXコマンドのひとつとなっていたのである。ちなみに日本国内でも、辻占煎餅よりも逆輸入されてきたフォーチュン・クッキーの方が流通しているようだ。面白いなあ。

シェルスクリプトで

そんなfortuneコマンドだが、実行している内容は非常に単純で

  • 指定されたファイルからランダムに文章を選び、標準出力に表示する

だけである。

わざわざパッケージマネージャの世話にならずとも、シェルスクリプトで自分で書く方が早い。*2

という事で以下のスクリプトを書いた。

btune.sh

#!/bin/bash
sed -n $(( $RANDOM % $( wc -l < $1 ) + 1 ))p $1

RAMDOM変数やシェル展開数式を利用している為、bash専用のスクリプトとなる*3。sedでランダムな1行を抽出している。

実行は以下のようにメッセージファイルを指定するだけだ。

$ ./btune.sh ~/.btune
機械エンジニアは兵器を作るが、その他のエンジニアはターゲットを作る。

これを/etc/profile.dや.bashrcに実行するよう記載しておけば、fortuneと変わらな挙動をする。

メッセージの追加も

$ cat >> ~/.btune
ざわ・・・ ざわ・・・
$

で済む。さらに、スクリプトファイルを置くのもイヤだという方は、\!* を駆使して alias 化しておくのもいい。

*1:Microsoft WindowsXP でいうと「ようこそ」画面にあたる部分

*2:大抵のディストリビューションには、コマンドの他にバイナリ化されているメッセージ集も含まれているので、全ての人にとってこの方法が最善という訳でもない。自分の場合、日本語メッセージを自由にカスタマイズしたかった点や暇潰しを兼ねた点が大きい。

*3:/dev/randomを上手く使えば、シェルに依存しないスクリプトが書けると思う。

コメントを残す

メールアドレスが公開されることはありません。