CUIの世界で暮らす場合、シェルの使いこなしで作業効率は桁違いに変わる。どのシェルを使うかは人それぞれだが、bashを使うことにしてみる・・・と考えていたが、便利そうなのでzshに移行。
プロセス毎に使えるリソースの大きさの調整・制限(limit)ができる。sh系ではulimitコマンドを使う。
ulimit -a
で現在のlimitがわかる。オプションのみを指定すればunlimitedにできる。具体的な数値を決めたい場合はオプションの後に入れる。以下がオプションの種類。
-c | コア |
-d | データセグメント |
-f | ファイル |
-s | スタック |
-t | CPU時間 |
-u | プロセス数 |
-v | 仮想メモリ |
変数内に複数の単語がある場合、展開の挙動は他のsh系シェルと異なる。最初はこれを知らずに相当ハマった。
要は、変数内の空白の解釈が「単語の区切り(従来の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の出力をいきなり編集
と、なにかと「いきなり」な事ができる。
とにかく設定ファイルが全てのカギを握る。