したがって、システムとのコミュニケーションを豊かにするためには、その顔である
シェルで表現できることを増やさなければなりません。多くの人は, (t)csh, あるいは
bash を使っていると思いますが、このドキュメントではそれらの上位互換の機能を
持つ zsh (z shell) について解説します。
便利さは趣味の問題でもありますが、ここでは多くの機能の中で研究/仕事に有用な
機能についてとりあげ、zshを使ってみることで研究/仕事の効率を高め、システムとの
コミュニケーションを豊かにされることを目的としています。
実用的な観点から見た場合, 特に日本語を処理する必要のある場合, zshは
% echo これは漢字です。というようにコマンドラインに日本語を表示/処理できませんが, zsh は非ASCII圏での 使用を最初から想定されて設計されているため, 特に何もしなくても上のように 日本語を自然に扱うことができます。
また、システム管理者からみると、tcsh と違い文法が sh の上位互換であるため,
システム管理で必要とされる sh の知識だけ覚えればよく, 普段から sh の文法に
親しむことでシェルスクリプトなどの理解が深まる点が挙げられます。
cshでシェルスクリプトを書くことは
一般によくないこととされており, 二つの体系を分けるよりも, 統一
された環境でよりシェルでのコミュニケーション技術を高めることができます。
もちろん, 後で述べるようにzshはtcshの機能はほぼすべて持っており, 使い勝手に
勝ることはあっても劣ることはありません。zsh 自身でシェルスクリプトを書く
ことも可能で, その時には拡張された 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 の実体を編集)などということもできます。
% ls *.texなどとすることができますが, zsh ではさらに, 後に
()
をつける
ことで属性を指定することができます。例えば, カレントディレクトリの中で
実行属性のあるものについてのみ chmod を行いたい場合,普通なら
% chmod 755 `ls -l * | awk '/^...x/{ print $9 }'`などとかなり頭を使わないといけないところを,簡単に
% chmod 755 *(x)とすることができます。同様にaから始まるディレクトリを
a*(/)
,
. で始まるエントリのうちファイルであるもの(~/.netscape などを除く)を
.*(.)
などと表すことができます。これらは研究はもちろんですが,
特にシステム管理者にとって便利な機能でしょう。**/*
と書けるなどがあり, これも zsh の強力な拡張機能の一つです。
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"'です。
% 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のようにその場で自分で作ったヘルプを見ることもできます。
http://www.zsh.org/にあります。
man zsh
してみて下さい。ただし, たいていは
これらを読まなくても, 普通に使う分には上の'Introduction to zsh'を読めば
こと足ります。マニュアルの日本語訳については, 下の zsh ML のページから
どうぞ。
ls
を ls () { ls -lF "$@" }
として
定義したところ, 無限再帰を起こして Sparc が死んでしまったことが
ありました。(上では, 関数定義の中で ls
ではなく,
command ls
とする必要がある)\
)があります。マニュアルをよく見ると書いてあります
が, これらを再定義するには
とする必要があります。command 外部コマンド..
または
builtin 内部コマンド..
setenv () { export $1="$@[2,-1]" }
を定義しておくと便利かも
しれません。
daiti-m@is.aist-nara.ac.jp Last modified: Sun Mar 10 01:05:25 2013 | [text] [Top] |