zshの本でお勉強 第2章

zshの本 (エッセンシャルソフトウェアガイドブック)

zshの本 (エッセンシャルソフトウェアガイドブック)

今日は第2章。

zshの初期化ファイル

デフォルトのファイル読み込み順

  • /etc/zshenv
  • ~/.zshenv
  • /etc/zprofile (ログインシェルの場合)
  • ~/.zprofile (ログインシェルの場合)
  • /etc/zshrc (これ以下すべて、対話的に起動した場合)
  • ~/.zshrc
  • /etc/zlogin (ログインシェルの場合)
  • ~/.zlogin (ログインシェルの場合)

何でもかんでも"~/.zshrc"に書いてしまってたけど、ログインシェルのとき、リモートシェルで起動するとき、一度だけ行えばいいだけの設定かどうか、など役割を考えて、どこに書くか分けてやるべきのようだ。

シェルオプション

"setopt" / "unsetopt"コマンドで様々なオプションを設定したり解除したりできる。引数を与えない場合、現在セットされている/されていないオプションを一覧表示される。試しにやってみたら、

$ setopt | wc -l
8
$ unsetopt | wc -l
151

どんだけ使いこなしてないんだ自分w

コマンド前置

コマンドの前に置くことで解釈や実行の働きを変えたりする

noglob

ファイル名のメタキャラクタ展開をしない

$ ls
fuga.txt hoge.txt piyo.txt
$ echo *
fuga.txt hoge.txt piyo.txt
$ noglob echo *
*
exec

fork(2)せずに現在のシェルのプロセスのままそのコマンドを起動する。

-

そのプロセスのargv[0]に"-"を前置する、らしい。

$ cat > hoge.c
#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("%s\n", argv[0]);
}
$ gcc hoge.c
$ ./a.out
./a.out
$ - ./a.out
-./a.out

で確認できたけど、どういうときに使うんだろう…?

コマンド検索制御

command / builtin

同名のコマンドが複数有る場合にどちらを実行するか指定する。
コマンドは

  1. エイリアス
  2. シェル関数
  3. "/"が含まれている場合、実行権限つきファイルを指定してあるもの
  4. 内部コマンド
  5. 外部コマンド

という順に検索されて実行されるらしい。

$ pwd
/Users/sugyan/temp/hoge
$ function pwd { echo "func" }
$ pwd
func
$ alias pwd="echo alias"
$ pwd
alias

"builtin"や"command"は、それらに左右されずに明示的に内部コマンドや外部コマンドの方を実行するようになる。

$ alias pwd="echo alias"
$ pwd
alias
$ builtin pwd
/Users/sugyan/temp/hoge
$ function ls { echo func }
$ ls
func
$ command ls
fuga.txt        hoge.txt        piyo.txt

このへんはbashも同じか。

whence

aliasや関数、コマンドの定義を出力したりできる

$ whence pwd
echo alias
$ whence -ac pwd
pwd: aliased to echo alias
pwd () {
        echo func
}
pwd: shell built-in command
/bin/pwd

"whence -ca"の代わりに"where", "whence -c"の代わりに"which"を使える。

enable / disable

エイリアス、関数、内部コマンドなどへの参照の有効/無効を切り替えられる。

$ where where
where: shell built-in command
$ disable where
$ where
zsh: command not found: where
$ enable where
$ where where
where: shell built-in command

"disable enable"ってやっちゃったら"enable"が使えなくなって元に戻すことができなくなっちゃうんだけど、そういうときはどうしたらいいんだろう ><


今日はここまで