zshで究極のオペレーションを

第1回 zshで広がる世界

この記事を読むのに必要な時間:およそ 4 分

zsh乗り換え直後の幸せ

zshを本格的に使い始めて間もなく,これはもう元に戻れないと強く実感した。とくに印象的だったのは以下の機能だ。

自動ヘルプとコマンドラインスタック

コマンドラインを入力中,オプションを再確認したくなる。 たとえば sudo コマンド。以下の文字列まで打ったところでオプションを確認したくなった。

% sudo -

zshでは ESC-h とタイプすると自動的に man sudo が実行される。読み終わってコマンドラインに戻ると入力途中の 同じカーソル位置に戻る。筆者の場合 sudo は頻繁に使うので alias s=sudo と,s だけで sudo している。そのような場合もzshはaliasを 展開したあとのコマンドを調べて man sudo してくれる。 aliasを開いて判断してくれるのはコマンドライン補完時も同じで こういう細かい挙動に抜かりがないのもzshのうれしい点だ。

マニュアルを読むことに限らず,コマンド打っている途中で 別のコマンドを打ちたくなったとき,zshでは ESC-q を 押すとコマンドラインがスタックに積まれ,空のコマンドラインとなる。新しいコマンドを実行し終えると,またスタックからコマンドラインが 下ろされる。tcshやbashではコマンドラインエディタのCUT&PASTEで1つのコマンドラインだけは保存しておけるが,スタックのように2段,3段…と多重に保管はできない。

ESC-hESC-q どちらも,思いつきでコマンドをどんどん入れたがる筆者には欠かせない機能だ。

強力なファイルグロッブ

tcshを使っていた頃はまだまだ経験値が足りず,ファイルを 選別するのに使う find コマンドが大の苦手だった。 なにかファイルを検索するのにその都度 find のマニュアルを 見ないと分からず……,いやマニュアルを見てもよく分からず適当に打っていた。弱い。

zshの **/ がディレクトリを再帰的に検索することでものすごく救われた。ついでに見付かったファイルの中から通常ファイルのみを選んだり,ディレクトリのみを選んだりするのもとても簡単だ。たとえば「カレントディレクトリ以下にあるすべての*.log または *.aux という通常ファイルのうち 4日以上アクセスしていないものは全部消す」としたい場合の find を使った例とzshの例を示す。

% find . '(' -name '*.log' -o -name '*.aux' ')' -a \
      -type f -a -atime +3 -exec rm '{}' ';'
% rm **/*.(log|aux)(.m+3)

ちなみに上の例の,find の例を作るのに,manを調べ,一応分かったけれども自信がないのでGoogle先生にお伺いを立て,実験してたぶん大丈夫とわかるまでに15分近くかかった。困ったことに上記の find で完全にあっている自信がない。さらに言えば,find の使い方を教わりにきた学生に所々あるクォート ' ' が何で必要なのかとか,何で丸い括弧ととんがり括弧があるのかとかを正確に理解させる根性ははっきり言って無い。

find の文法を覚えても,find でしか役に立たない。いや,tcpdump などにちょいと似ているから完ぺき無駄って訳じゃないが,それと格闘する時間はどうかデートに使ってくれと言いたい。

柔軟な補完

tcshの complete でたっぷり補完機能定義をしていたため,それとほぼ同等の機能は欲しかった。乗り換え当時のzshの補完機構 compctl は,最初難解に感じたが パターンさえ把握すればtcshと同等のものがすぐ作れると 分かった。それ以上に,補完候補を決めるときにシェル関数を 呼べることが分かって「これはもう何でもアリだ」と強く感じた。

関数が呼べるなら,どんなコマンドでも呼べる。 ということはUnixでできることは何でもできるということだ。

シェル関数

補完でシェル関数が使えると分かり,それと同時にcshには関数がないのに我ながらよく使っていたものだと感じた。Emacs-Lispで関数が使えなかったら誰が使うだろう,というか, ウィンドウマネージャFVWM2の設定ファイル.fvwm2rcにだってユーザ定義関数を書けるというのに。

sh系のシェルがどれほど優位なのか思い知ったのがこの点だった。

『zshの本』

zshに完全に乗り換えた1994年当時,周囲には誰もzshを使っている人間はいなかった。だがtcsh全盛の時代で,シェルのカスタマイズに燃える人は多かった。tcshはすごい,でもzshはもっとすごい。これは何とか広めたい,と思ってまずはマニュアル(zshバージョン2.6のもの)を和訳し公開した。同時に compctl 補完の設定例もWebにさらしておいたりもした。

そのWebがきっかけとなり書籍化の話が出たのが2003年だった。引き受けたものの,当時既にzshの補完機能は compsys という,より洗練されたものに移行していて,これがさっぱり分かっていなかった。マニュアルの該当箇所を見ても,細かい関数の仕様説明が並んでいるだけで,どういう体系のものでどう考えて使えばよいのかの説明は見当たらなかった。難しすぎる。舟橋君『UNIX USER』に書いていたcompsysの解説記事を何度も何度も読んで,自分が使える程度の理解はできたものの,それを説明できるほどの知識には程遠かった。結局やはり地道にマニュアルの和訳から入ることにした。と決断したものの,学生時代に訳したものより長いうえに,当時ほどの時間もなく,読んで理解しても次に読むときには前のことを忘れてしまうありさま。全部訳すのは諦め,理解するのに最低限のところだけ訳すことにした日本語 zsycompsys.txt⁠。この割り切りでやっとcompsysの全体を理解でき, zshの本の完成に辿り着けそうだと思えた。これが2007年。いやはや,大きな山だった。

zshユーザはおそらく濃厚な制覇欲がある。これを裏切らないよう,本書では,補完システム以外でも,自分がこれまでshで難しいと感じていた部分を,理解した順番で説明するようにした。全体の半分程度はzshではなくshの説明になっているので,本書でzshをマスターする頃には同時に shをも制覇してもらえるのではないかと考えている。

そういう理屈はさておき,zshは「こうなるといいな」と思ったことがほぼすべて実現できる柔軟性を持ったシェルであり,なにより使っていて楽しい。まずはインストールしてみて,使ってみてほしい。次回は,別のシェルから乗り換えるときにつまずきがちな点などを紹介しよう。