repeat & eval

シェルの話。

repeat って便利ね。繰り返してくれるシェル内蔵コマンドね。

SunOS の lpq は、

% lpq 3

のようにすると、プリンタキューが消えるまで3秒毎にlpqを繰り返してくれ るんだけど、BSDなlpqは一回で終わっちゃう。こんなときは、repeat使うでござ る。

% repeat 10 lpq

およよよ、速すぎや。waitをかけたい。一定時間止まるのはsleepだったな。 じゃあこうしようかな?

% repeat 10 lpq; sleep 3

これダメね。何故ならセミコロンまでがひとつのコマンド列と見なされちゃ うから、10回繰り返してから sleep 3 が一回だけ評価される。じゃあ、セミコ ロンがマルチステートメントを意味しないようにクォートしてみようか。

% repeat 10 "lpq; sleep 3"

はい、これもダメ。「lpq; sleep 3: Command not found」ね。結局repeatは ひとつのコマンドのみを繰り返せるだけ。そんなときは eval を使うと良い。

% repeat 10 eval "lpq; sleep 3"

evalは任意の文字列を再度コマンドラインとして評価してくれる。

さて、ここで次の repeat が効くかどうか手元のシェルで試してみたまへ。

% repeat 10 eval "echo -n . ; sleep 1"

これは画面にピリオド(.)を一秒置きに10個表示するためのrepeatである。 「そんなのできるに決まってるじゃん」と思う君は正しい。10個のピリオドが現 れなかった君は、使っているシェルは実はいい加減な作りだったと認識すること になるだろう。


きまぐれ記
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]