zsh
for the working researcher
*

Daichi Mochihashi
daiti-m@is.aist-nara.ac.jp
April 30, 1999

0. はじめに

Unixに代表されるコマンド入力型の文化は世界の一つの側面であり、シェルはその 顔です。シェルに打ち込む文字列は言語に似て、一次元の記号列でありながら 豊かなイメージを持ち、多くの仕事を行うことができます。私はMacintoshが 大好きですが、GUIだけでなくそのような文字列によるシステムの操作にも ある種の美を感じ、また便利でもあると思っています。

したがって、システムとのコミュニケーションを豊かにするためには、その顔である シェルで表現できることを増やさなければなりません。多くの人は, (t)csh, あるいは bash を使っていると思いますが、このドキュメントではそれらの上位互換の機能を 持つ zsh (z shell) について解説します。
便利さは趣味の問題でもありますが、ここでは多くの機能の中で研究/仕事に有用な 機能についてとりあげ、zshを使ってみることで研究/仕事の効率を高め、システムとの コミュニケーションを豊かにされることを目的としています。

1. zsh の特徴

zsh は Unix および類似の環境の下で動くシェル(xterm, kterm などでプロンプトを 出し、コマンド入力を解析して実行するもの)で、sh, csh, tcsh, bash などの他の すべてのシェルの機能を持つことから '最後のシェル' という意味で zsh と 名付けられています。 NeXT では tcsh とともに標準のシェルとして採用されていました。 シェルには大きく分けて の2つがありますが, zshは後者に属します。

実用的な観点から見た場合, 特に日本語を処理する必要のある場合, zshは

という点が大きな利点です。つまり, csh や tcsh では別に日本語化パッチを当てない と
 % echo これは漢字です。
というようにコマンドラインに日本語を表示/処理できませんが, zsh は非ASCII圏での 使用を最初から想定されて設計されているため, 特に何もしなくても上のように 日本語を自然に扱うことができます。

また、システム管理者からみると、tcsh と違い文法が sh の上位互換であるため, システム管理で必要とされる sh の知識だけ覚えればよく, 普段から sh の文法に 親しむことでシェルスクリプトなどの理解が深まる点が挙げられます。 cshでシェルスクリプトを書くことは 一般によくないこととされており, 二つの体系を分けるよりも, 統一 された環境でよりシェルでのコミュニケーション技術を高めることができます。
もちろん, 後で述べるようにzshはtcshの機能はほぼすべて持っており, 使い勝手に 勝ることはあっても劣ることはありません。zsh 自身でシェルスクリプトを書く ことも可能で, その時には拡張された zsh の機能で, より多くのことを簡潔に 表現することができます。

2. zsh の機能

上で少し触れたように、zsh は機能的には sh/csh/tcsh/bash の機能をほぼすべて 持っており, 他にも強力な補完機能など様々な特徴を持っていますが, 重要なのは "どのように研究/仕事に役立つのか" という点でしょう。そこでここでは, zshをこれまで使ってきた中で特に有用だと思った以下の機能についてご紹介します。

2.1 process-file substitution

zshでは、=(コマンド) とすることでこの部分をコマンドを実行した 結果の仮想的なファイルで置き換えることができます。つまり
    % vi =(finger)
として finger の結果を編集(して必要なら中でセーブ)できるわけですが、 これは
    % sort +2 -n data1 > data1_sort
    % sort +2 -n data2 > data2_sort
    % compare.pl data1_sort data2_sort
とするところを、
    % compare.pl =(sort +2 -n data1) =(sort +2 -n data2)
ですむということで、データ処理の際にきわめて便利です。
なお、=はオーバーロードされており、'=コマンド'とすると この部分はコマンドのフルパスと置き換わります。従って,
    % echo =ls   (lsの実体を表示. which と違い、alias 等を無視する)
    % jed =wwwlog  (コマンド wwwlog の実体を編集)
などということもできます。

2.2 file selection

普通のシェルでも、.texだけ見たい時に
    % ls *.tex
などとすることができますが, zsh ではさらに, 後に()をつける ことで属性を指定することができます。例えば, カレントディレクトリの中で 実行属性のあるものについてのみ chmod を行いたい場合,普通なら
    % chmod 755 `ls -l * | awk '/^...x/{ print $9 }'`
などとかなり頭を使わないといけないところを,簡単に
    % chmod 755 *(x)
とすることができます。同様にaから始まるディレクトリを a*(/), . で始まるエントリのうちファイルであるもの(~/.netscape などを除く)を .*(.)などと表すことができます。これらは研究はもちろんですが, 特にシステム管理者にとって便利な機能でしょう。
またカレント以下のファイル全てを対象にする場合, find を使わずに **/*と書けるなどがあり, これも zsh の強力な拡張機能の一つです。

2.3 cd

ディレクトリを次々と起動して, 前のディレクトリに戻るのが難しいと思った ことはないでしょうか。cd のかわりに pushd を行い, dirs して, popd [n] を 実行すれば戻れますが, うっかり push し忘れていて戻れないこともありますし, 何より操作が面倒です。

zsh では setopt autopushd しておけば cd の際に自動的に pushd してくれますが, ここで前に行ったディレクトリに移る時に gd というコマンドがあります。

    % cd /foo
    % cd /usr/local
    % cd /var/spool/mail
    % gd
    0    /var/spool/mail
    1    /usr/local
    2    /foo
    select number: 2[RET]
    % pwd
    /foo
実は gd はエイリアスで, 中身は
    % grep gd ~/.zshrc
    alias gd='dirs -v; echo -n "select number: "; read newdir; cd -"$newdir"'
です。
このコマンドはとても便利で, 私は愛用しています。

2.4 command line stack

    % gcc -o foo -O foo.c -lm -lnsl -lsocket -l
とまで打って, 「しまった, このディレクトリに必要なライブラリがあったかな」 と思って ls したくなったりすることはよくあると思います。このような時,普通は C-a C-k/C-u で今入力した一行を消し, ls してから同じコマンドを新しく 入れ直すわけですが, 上のようなオプションの多い複雑なコマンドライン のように, すぐに復元するのは困難な場合があります。

zsh なら, 消すかわりに M-q(or ESC-q) をタイプすると

    % _
のように一旦行が消えますので, ここで忘れたコマンドを実行すると, 次には
    % gcc -o foo -O foo.c -lm -lnsl -lsocket -l
とM-qで保存したテキストが復活します。 ここでおもむろに残りをタイプして 実行するだけです。もちろん, ここでまた M-q することも可能です。
コマンドラインに状態を持たせることで, 作業がかなり楽になるのがおわかり頂ける かと思います。

なお, コマンドを打ってから M-h すると, man [そのコマンド] が実行され, 終わるともとのコマンドを入力した状態に戻ります。manを実行する 関数はカスタマイズできますので, コマンドの使い方を書いたテキストファイルを 作っておき,

    % a2ps[M-h]
    a2ps -p  [onecolumn]
         -nh [no header]
         -ns [no mbox]
    % a2ps
のようにその場で自分で作ったヘルプを見ることもできます。

3. zsh の動く環境

zsh は SunOS, IRIX,...などの Unix のほか, でも動作します。特に Windows では私の場合, cygwin 付属の bash.exe や tcsh.exe では使っているとWindows全体が固まってしまい, Windowsを再起動しなければならない ことが度々ありましたが, zsh.exe ではそのようなことはありませんでした。
また X68000 へのポート は大分前(1994年)に行われており, Unix と同じ環境を 手に入れることができ, zsh-X68k メーリングリストも存在していました。 今となっては直接恩恵を受けられる人は少ないかもしれませんが, 普及の度合いを はかる目安にはなるでしょう。後に紹介するように, この頃作られた 'Introduction to zsh'の日本語訳は zsh への入門としてたいへん優れたものです。

4. zsh の入手

zsh の メインサイトは
http://www.zsh.org/
にあります。

5. その他の情報

6. Tips


daiti-m@is.aist-nara.ac.jp
Last modified: Sun Mar 10 01:05:25 2013
[text] [Top]