CUIの世界で暮らす場合、シェルの使いこなしで作業効率は桁違いに変わる。どのシェルを使うかは人それぞれだが、bashを使うことにしてみる・・・と考えていたが、便利そうなのでzshに移行。

*link
-[[zsh for the working researcher:http://cl.aist-nara.ac.jp/student/daiti-m/text/zsh-intro.html]]
-[[至高のコマンドインタプリタzsh:http://www.gentei.org/~yuuji/rec/pc/intro-zsh.html]]
-[[zshのある暮らし:http://hiki.ex-machina.jp/zsh/]]
-[[ドットファイルの例:http://www.is.akita-u.ac.jp/~sig/dots/dot-files.html]]
-[[An Introduction to the Z Shell (Japanese):http://tehanu.hpcl.titech.ac.jp/zsh/waka/intro.html]]
-[[FAQ:http://zsh.sunsite.dk/FAQ/]]
-[[FAQ (2000年のものの和訳):http://dengaku.org/~naoki/zsh/FAQ-J/zshfaq-j.html]]

*メモ
**リダイレクト
[[リダイレクト:http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8]]([[UNIXの部屋:http://x68000.q-e-d.net/~68user/unix/]]より)に詳しく記述されていた。

**変数の展開

変数内に複数の単語がある場合、展開の挙動は他のsh系シェルと異なる。最初はこれを知らずに相当ハマった。

-[[FAQ 3.1: Why does $var where var="foo bar" not do what I expect?:http://zsh.sunsite.dk/FAQ/zshfaq03.html#l17]]

要は、変数内の空白の解釈が「単語の区切り(従来のsh系シェル)」、「空白文字そのもの(zsh)」と異なっているようなのだ。従来のsh系シェルと互換性を持たせた解釈をさせるためには
 setopt sh_word_split
とするか、あるいは変数$varを${=var}とする。
 $ touch foo
 $ touch bar
 $ var="foo bar"
 $ ls foo
 foo
 $ ls bar
 bar
 $ ls foo bar
 bar  foo
 $ ls "foo bar"
 ls: foo bar: No such file or directory
 $ ls $var
 ls: foo bar: No such file or directory
 $ ls ${=var}
 bar  foo
 $ setopt sh_word_split
 $ ls $var
 bar  foo
 $



*機能

上記linkをはじめ、各所で紹介されていることを抜粋しているだけです。

**ファイル選択
setopt extended_glob しとかないとダメなものがあるかも。

***例外
 *.c~main.c
は、「拡張子cのファイル、但しmain.c以外」の意

***数字の範囲
 touch a{0..100}
とすると、a0, a1, ... , a100 なるファイルが作られる。b{000..100}とすると、ちゃんとゼロパディングして b000, b001, ... ,b100 となってくれる。

また、<x-y>は整数xとyの間にマッチする。例えば
 ls a<50-60>
などとする。

***サブディレクトリの再帰的検索

例えば

 ls **/*.c

で、カレントディレクトリ以下の拡張子cのファイル全てを列挙できる。


***属性
 pattern('一文字')
などとして属性の区別ができる。
| / | ディレクトリ |
| @ | リンク       |
| x | 所有者に実行可能(大文字...他人に実行可能) |
| r | 所有者に読込可能(大文字...他人に読込可能) |
| w | 所有者に書換可能(大文字...他人に書換可能) |

つまり
 ls -dF *(w)
とすると、カレントディレクトリ中の実行可能ファイルのみ列挙する。


**ディレクトリスタック
使用に必要なオプションについては別な所を参照。

これが有効になっていると、
 [~]$ dirs -v
 0       ~
 1       ~/tmp
 2       /opt
 [~]$ cd ~2
 [/opt]$
などと、今まで行ったディレクトリの履歴をリスト表示し、番号指定したら一発で飛べるようになる。


**コマンドラインスタック
コマンド入力中、M-qとするとそれまでの入力内容が消えたように見える。しかし、新たにコマンドを入力・実行した後にその内容は復活する。長いコマンド入力中の「しまった、あそこのディレクトリの構成知らんからこれ以上入力できん。しかし今までの入力を消すの勿体ない」というシチュエーションの強い味方

**コマンドの出力結果
=(command) とすると、その部分は「command出力結果の格納した(仮想的な)ファイル」と見做される。また、=command とすると、その部分は"which command"とほぼ同等となる。
 echo =cat # --> /bin/cat
 vi =(ls) # --> ls の出力結果が編集できる。

例えば・・・
 vi =command # バイナリと見せかけて実はスクリプトな実行ファイルをいきなり編集
 vi =(ls | sort -r) # 順番を入れ変えたlsの出力をいきなり編集

と、なにかと「いきなり」な事ができる。

*.zshrc
とにかく設定ファイルが全てのカギを握る。
-[[自分の.zshrcの出所:http://nymos.dyndns.org/archive/zsh/generic_zshrc]]


*bash時代のメモ

**プログラマブル補完
-[[Working more productively with bash 2.x:http://www.caliban.org/bash/]]