Zsh
Zsh 環境設定
~/.zshrc
メインの設定ファイルで、以下のような項目を記述します。なお、各ユーザ固有の zsh の設定は ~/.zshrc のファイルで行います。
(なお rc は UNIX の起動時に実行されるファイル /etc/*rc 系の名残で run command の略)
- ・ limit、umask、stty などの設定
- ・ PATH, LD_LIBRARY_PATH など環境変数の設定
- ・ PROMPT、SAVEHIST などシェル変数の設定
- ・ alias(エイリアス) の設定
- ・ function(関数) の設定
- ・ autoload(追加機能) の設定
- ・ bindkey(キーバインド) の設定
- ・ zstyle(補間などのスタイル) の設定
- ・ zshoptions(オプション) の設定
また、必要に応じてシェル変数 OSTYPE により OS ごとの場合分けをします。
exportは変数を環境変数として宣言します。alias はコマンドに別名を設定します。
複雑なコマンドは
functionで関数として設定します。
Emacs や vi などのエディタのキーバインドに慣れている人は、bindkey -e や-v でどちらかのキーバインドを設定しておくことで、zsh のマルチラインエディタと
高度なコマンドライン編集機能を活用することができます。
なかでも
precmdは、プロンプトとが表示される前に毎回必ず実行される特別な関数です。
zstyle と setopt は zsh の挙動を大きく変更する設定で様々な選択肢がありますので
% man zshoptions |
% man zshall |
などを参照して、使いやすい設定にしてください。
こちらから設定のサンプルファイルをダウンロードできます。
~/.zlogout
シェルを終了する際に 1 度だけ実行されるファイル。たとえば clear と書いておけばログアウト時に画面がクリアされます。
~/.zhistory
使用したコマンドのヒストリを記録しておくファイル。シェル変数 SAVEHIST に指定した行数のコマンドが記録されます。
次回 zsh を起動した際にも、矢印↑や Ctrl-R による検索で以前の履歴を遡ることができるため、長いコマンドラインを入力し直す手間が省けます。
Zsh の Tips
zsh には他のシェルにはない便利な機能が数多くあります。
- ・状況に応じた補間候補のメニュー選択機能
- ・ Ctrl-r,Ctrl-s によるヒストリ検索機能
- ・マルチラインエディタ zle を内蔵
- ・環境変数エディタ vared を内蔵
- ・再帰的で分かりやすいファイルマッチ**/*(@)
- ・ kill-region など多彩なコマンドライン編集機能
- ・コマンドのフルパス展開機能 =blastall
など以下では zsh のちょっとした小技を紹介します。
ファイルの属性による選択
ワイルドカードを () で修飾して
% ls /etc/**/* | #/etc 以下の全ファイル |
% ls /etc/**/*(.) | #/etc 以下の通常ファイル |
% ls /etc/**/*(@) | #/etc 以下のリンク |
% ls -d /etc/**/*(/) | #/etc 以下のディレクトリ |
のように、特定の属性を持つファイルだけを選択することができます。さらに
% ls -l *(L0) | #サイズが 0 のファイルのみ |
% ls -l *(f700) | #rwx------のファイルのみ |
% ls -l *(u[hoge]) | #ユーザ hoge のファイルのみ |
% ls -l *(g[db]) | #グループ db のファイルのみ |
といったファイルのモードでの選択や
% ls -l *(mw-3) | #3 週間以内に更新されたファイル |
% ls -l *(m0) | #今日更新されたファイル |
% ls -l *(mM+6) | #6 ヶ月以上古いファイル |
% ls -l *(ch-2) | #2 時間以内に移動等したファイル |
のようにタイムスタンプによる選択が可能です。
リンクファイルそのものではなく、リンク先のファイルを指す場合には先頭に-をつけます。
ディレクトリとディレクトリのリンクの場合 (-/) など。
% ls -l *(-/) | |
% ls -l *(-m0) | |
タイムスタンプ指定方法の詳細
1. 時刻の種類を指定
ファイルのタイムスタンプは 3 種類あります。
m ファイルの更新時刻 a 最終アクセス時刻 c i-node の変更時刻
2. 期間の指定
指定なしの場合の数字は日数を表します。
M 月 (month) W 週 (week) h 時 (hour) m 分 (minute) s 秒 (second)
3. 時間軸の指定
指定なしの場合ちょうどその時間 (n 日前、m 分前などを) 表します。
+ 指定した時刻以前 - 指定した時刻以降
4. 数値の指定
時間を表す数字を指定します。
m 番目から n 番目までのファイル
パターンにマッチするファイルのうち何個目のもの、という指定も可能です。
DSC で始まるファイルのうち 2 番目から 5 番目のファイルにマッチする場合:
ちなみに、以下のようにするとファイル名の末尾が 2 か 5 で終わるファイルになります。
数字リスト展開
数字の並びを {m..n} で生成することができますので、連番のファイルやその一部を処理する際に便利です。
% mv DSC0{3769..3822}/jpg photo/ |
% for i in {1..10} |
do |
cp foo$1.txt bar$1.txt |
end |
「このパターン以外」のファイル
.zshrc.all ファイルに setopt extended_glob のオプションを追加することで、~を使用して、ほとんど全部のファイルにマッチしたいけど、
このパターンだけは除外するということができます。
% ls *~CVS | #CVS 以外の全てのファイル |
% rm *.o~hoge.o | #hoge.o 以外の全ての.o ファイル |
% ls *~*[0-9]* | #数字を含むファイル以外 |
ファイル名からパス名を取り去る
ファイル名に対する basename や dirname コマンドと同様の操作を zsh の機能だけで実現できます。
#ruby コマンドのパス (=ruby) を変数に格納 |
% file==ruby | |
#basename コマンド担当 |
% echo $file | #/usr/local/bin/ruby |
#basename コマンド担当 |
% echo $file:t | #ruby |
#dirname コマンド担当 |
% echo $file:h | #/usr/local/bin |
標準エラー出力の取り扱い
sh、bash など (B シェル系) では、標準出力 (1) と標準エラー出力 (2) を使い分けることができます。混ぜるには 2>&1 を使います。
% command 1> out.log 2> err.log | #別のファイルに |
% command 2>&1 | less | #混ぜてパイプに |
% command > outerr.log 2>&1 | #混ぜてファイルに |
csh、tcsh など (C シェル系) では、標準エラー出力だけを使い分ける機能がないためサブシェルの構文を使います。一方、混ぜる場合は>&や|&と簡潔に書くことが出来ます。
% (command1 > out.log) >& err.log | #別のファイルに |
% command |& less | #混ぜてパイプに |
% command >& outerr.log | #混ぜてファイルに |
zsh では、B シェル系の 1>、2>を使った使い分け構文と |&、>&の混ぜ構文のどちらも利用できます。
複数コマンドとの入出力
paste、cut と zsh の<(コマンド) 構文をつかうと「file1 の 1 カラム目と file2 の 3 カラム目を連結」といった操作も中間ファイルを使わずに実行可能です。
% paste <(cut -f1 file1) <(cut -f3 file2) |
さらに、>(コマンド)。構文を使って同じ結果を複数のプロセスに渡すことも出来ます。このため|と tee の組み合わせよりも柔軟に出力を加工することが可能です (この機能を利用するには set opt multios の設定が必要)。
% paste <(cut -f1 file1) <(cut -f3 file2) |
> >(ruby -e 'p ARGF.read') |
> >(perl -e 's/~/perl:/') |
% date > >(tac) >(cat) |
サブプロセスの完了を待つ
wait 文を使うとシェルスクリプトなどで並列に実行したサブプロセスの終了を待つことが出来ます。
#FASTA フォーマットのファイルを準備 |
: |
#BLAST を実行 |
for s in *.seq |
do |
blastall -p blastp -i $s -d db > $s.out & |
done |
wait |
: |
#結果を解析 |
: |
ページトップへ