zshを使い始めるとき、
決断
シェルは手に馴染ませてこそ光り輝く道具である。それを変更するのは大きな決断で、
- Q.zshが便利そうなのは分かった。だが、
その分zshの使えないところに行ったら困ることになりそう。 -
A.大丈夫。今のシェルで使いこなしている機能以上に、
zshを使えるようになったときには元のシェルに関する知識も増えているはず。zshは、 どんな変数展開やヒストリ展開でもTabキーで正確に補完してくれるし、 if、while、forの複数行に渡る構文をコマンドラインで使っても行エディタでしっかり再編集できるので、意識して使うようにすればどんどん構文知識が蓄積できる。そしてその多くは他のシェルに由来するものなので、 元のシェルに戻ったときもこれまでとは一味違う使いこなしができる。 もっとも、
あまり知識が増えていなくても、 zshの使えないところにログインしてzshのインストールを完了させる程度のコマンドはどんなシェルでも迷わずできるだろう、 - Q.シェルの設定ファイルを作るのがたいへん…。
-
A.こればかりは
「1度作れば10年以上使える」 と思って頑張るしかない…。 けれども、
見本設定ファイルを用意したので取り敢えずはそれを使えばいいし、 bashやkshなどsh系からの乗り換えなら文法が同じなのでほとんど苦労しないだろう。csh/ tcshからの場合は制御構造が全く変わるので1度は覚えなければならないが、 それは本記事の 乗り換えガイドで十分対処できると考える。 tcshでたくさん個人的な補完設定をしている場合たいへんそうだが、
zshの補完システムはデフォルトでほとんどのコマンドの補完定義が入っているため、 実質的に作り直さなければならない補完設定は数えるほどしかないと想像できる。 もう一つ、
tcshでキー割り当ての設定をたっぷり変えている場合だが、 実はこれは意外に楽で、 bindkeyコマンドの文法や割り当てる機能の名前がtcshとzshでかなりの部分同じであるため、大部分はそのままコピーしてしまっても動く。もし、 互換性がなくてエラーが起きても、 zshは初期化ファイルのエラー箇所を示してくれるため、 デバッグもやりやすい。 - Q.使った。便利すぎる。rootのシェルで使っても大丈夫かな…?
-
A.自分で大丈夫と思うなら大丈夫。自信が持てないならもう少しあとで。
もう少し親切に説明すると、
たとえばrootでzshを使い始めて少ししたら、 /bin/をバシっと消してみる。その対処法がすぐ分かるスキルがあるなら大丈夫。ちなみに筆者はコンソールにアクセスできるマシンはrootのログインシェルもzsh /bin/に、zsh そうでないマシンは以下のように設定し、 スーパーユーザになるときに SUで個人のログインシェルを起動する( sudoの-s)ようにしている。 alias SU='sudo -H -s'管理者の仕事には正確にかつ大量にかつ素早く行なわなければならないものがあり、
手順を忘れないための機能 (コマンドラインスタック) や、 ファイルを的確に一発で選べる機能があるzshは不可欠である。もちろん、 しつこいようだが、 行編集機能のない shやcshでも迷わず操作できるスキルあってこその選択である。
zshの導入と初期設定
zshを使い始めるためには、
まずは、
- zshの最新リリース版
[1] ソースを取得、 展開。 ./にconfigure --enable-multibyteを付けて起動。--prefixはお好みで。make && sudo make install
zshの起動時に、
zshenv、zshrc、zlogin を取得後、
設定ファイルの種類
bashユーザは、
.zshenv- 常に有効化したい設定を- ユーザのUIDでシェルが起動されるときに必ず読まれる。ただしzshに
-fオプションが指定されたときなどを除く(以下同様)。 - シェル経由で起動したいプロセスすべてで有効になるような設定、
たとえば PATH、LANGなど主要な環境変数定義や、リモートシェルやエディタの子プロセスなど非対話的に起動したときも使いたいエイリアスや関数定義がもしあればそれを記述する。
- ユーザのUIDでシェルが起動されるときに必ず読まれる。ただしzshに
.zshrc- 対話的シェルでの設定を- 対話的処理で起動されたときに読まれる。
- コマンドライン操作をするときだけ必要となる設定、
たとえばヒストリ、 エイリアスと関数定義、 キー割り当て、 補完設定、 関数のオートロード、 シェルオプション、 などを記述する。
.zlogin- ログインシェルでの設定を- ログインシェルでのみ読まれる。
- 対話的処理でのみ必要となる環境変数設定や、
ログインしたときに自動的に起動したいコマンド ( fortune等)の起動を記述する。 - サンプルには
「端末制御などは .zloginで」と説明があるが、 現在では仮想ターミナルでシェルを開くことも多く、 その場合 .zloginは読まれない。sttyなどによる端末制御は.zshrcに書く方がよい。
初期化ファイル書き換えポイント
今使っているシェルの初期化ファイルで、
ただし、PATH変数の設定といった場合分けや文字列の値による場合分けなどは、if 文なしでスマートに記述できることを念頭に置いておくとよい。
制御構造
非常におおざっぱな書き方だが、
| cshの構文 | zsh(sh)の構文 | |
|---|---|---|
if (EXPR) then ... else if (EXPR2 ) ... else ... endif | → |
if [[ EXPR ]]; then ... elif [[ EXPR2 ]]; then ... else ... fi |
if (EXPR ) COMMAND | → |
[[ EXPR ]] && COMMAND |
if (!EXPR ) COMMAND | → |
[[ EXPR ]] || COMMAND |
while (EXPR ) ... end | → |
while [[ EXPR ]]; do ... done |
if ({ COMMAND }) then ...
あるいは
while ({ COMMAND }) ...
(条件部がコマンド起動のもの)
| → |
if COMMAND ; then ... あるいは while COMMAND ; do ... |
switch (VAL ) case "PAT1 ": ... breaksw case "PAT2 ": ... breaksw default: ... endsw | → |
case VAL in
PAT1 )
...
;;
PAT2 )
...
;;
*)
...
esac
|
foreach VAR in (WORDS... ) ... end | → |
(cshのforeachはzshでもそのまま 使えるが、 |
エイリアス定義
zshのエイリアス定義が代入形式であるのは第1回で述べたとおりである。cshとの対比例を示す。
cshのalias | zshのalias/関数 | |
|---|---|---|
alias a b c d e ... |
→ | alias a='b c d e ...' |
alias dir 'ls -lF \!*|more' |
→ | dir () {ls -lF !*|more} |
エイリアスへの引数指定\!*)\!:N に対応するシェル関数への引数は $N。
引数を取らないcshエイリアスが大量にある場合は、
calias () {alias $1="$*[2,-1]"}
そして、.cshrc のalias定義をすべてコピーしてからcaliasに置換するという手もある。しかし、
変数への代入処理
これもおおざっぱに書き換え例を対比で示す。
| cshの変数定義 | zshの変数定義 | |
|---|---|---|
set x=y | → | x=y |
set x = y | → | x=y |
setenv X Y | → | export X=Y |
setenv が大量にある場合は、
setenv () { typeset -x "${1}${1:+=}${(@)argv[2,-1]}" }
また、~/.cshrc や ~/.bashrc を作っている場合、path 変数の設定でたとえば以下のような場合分け処理をすることがある。
# cshの場合
if (-d /opt/kde/bin) then
set path=($path /opt/kde/bin)
endif
# bashなどの場合
if [[ -d /opt/kde/bin ]]; then # あるいは [ -d ... ]; then
PATH=${PATH}:/opt/kde/bin
fi
zshの場合は場合分け不要で、(N) フラグを用いると以下な記述が可能である~/.zshenvに記述)。
# zshの場合
path=($path /opt/kde/bin(N) /opt/gnome/bin(N) /usr/pkg/*bin(N)
/usr/X11R{7,6}/bin(N) /var/*/bin(N))
typeset -U path
typeset -U は配列の各要素値から重複するものを削除する宣言で、source ~/.zshenv しても path(PATH) の値が無駄に長くなることがない。また、path と環境変数 PATH には連動関係が築かれている。path に配列値を代入すると、PATH に自動的にセットしてくれる。パス名にグロッビング記号の使える配列への代入で (N) を使用すると簡潔な記述で済む。
変数連動機構は環境変数 MANPATH にも適用できる。シェル変数 manpath に配列値をセットすると自動的にコロン区切りの値が MANPATH にセットされる。
キー割り当て
zshでキー割り当てを変えるための bindkey の主な用法は以下のとおりである。
bindkey キー 機能 [ キー 機能 ... ]
bindkey -s キー 文字列 [ キー 文字列 ... ]
-s オプションは
% bindkey -e % bindkey
tcshで個人的に bindkey 設定をしているのであれば、
シェルオプション
シェルオプションは setopt、unsetopt コマンドでそれぞれON、man zshoptions で設定できるシェルオプションが得られる。オプション名を見れば働きが想像のつくものが多いため、
補完
以前(zshの標準補完がcompctlだった頃)は、complete 定義を compctl に変換するスクリプトlete2ctl).zshrc で、.zshenvサンプルには組込み済)。
autoload -U compinit; compinit
それでも足りないとなって初めてzsh補完システムの使い方を紐解けばよいのではなかろうか。
その他
その他細かい変数などはzshのソースアーカイブの Misc/ スクリプトを参考にすると典型的な書き換え例が分かるだろう。
いざ起動
まずはzshを起動してみよう。compinit で標準補完を有効化している場合、
以下をタイプすると候補単語の種類が適切に選ばれていることが実感できる。
- Tab (C-i) - 補完
- C-d - 補完候補表示
ただおそらく、
次回は、