zshの本でお勉強 第2章 2

zshの本 (エッセンシャルソフトウェアガイドブック)
今日はディレクトリ操作。

cdコマンド

cd [-qsLP] [ NAME [ NAME2 ] ]

フルパスのNAMEをNAME2で置換したものがあればそこに移動できる、とか微妙な便利機能が付いているらしい。

$ cd /usr/bin
$ pwd
/usr/bin
$ cd bin sbin
/usr/sbin

ディレクトリとシンボリックリンク

シンボリックリンクディレクトリにも適用できることにより、ある特定のディレクトリには複数のパス名が存在し得る。
zshを含め大抵のシェルでは、カレントディレクトリまで到達した経路を保存しておき、そこから元の親ディレクトリに戻れるようになっているらしい。

$ pwd
/Users/sugyan
$ ln -s /usr/bin
$ ls -l bin
lrwxr-xr-x  1 sugyan  staff  8  5 27 09:18 bin -> /usr/bin
$ cd bin/..
$ pwd
/Users/sugyan

が、cdコマンドの"-P"オプションを指定した場合、もしくはシェルオプションCHASE_DOTSやCHASE_LINKSが有効になっている場合、'..'はシンボリックリンクを解決したパスを基準に移動するようになる。逆に"-L"オプションを使えばそれらのシェルオプションが有効であってもシンボリックを解決しないパスに移動できる。

$ cd -P bin/..
$ pwd
/usr
$ cd
$ pwd
/Users/sugyan
$ setopt chaselinks
$ cd bin/..
$ pwd
/usr
$ cd
$ pwd
/Users/sugyan
$ cd -L bin/..
$ pwd
/Users/sugyan

まぁデフォルトの挙動で不便に思ったこと無いし、特に設定変える必要ないかなぁ。

ディレクトリスタック

"pushd"コマンドを使うと、現在のディレクトリをディレクトリスタックに積んで保存することができる。引数を省略した場合は、スタックの1番目と2番目を交換する("push"じゃないじゃん、って気もするけど)

$ pwd
/Users/sugyan
$ pushd temp
~/temp ~
$ pushd /usr/bin
/usr/bin ~/temp ~
$ pushd
~/temp /usr/bin ~

積まれたディレクトリスタックの情報は"dirs"コマンドで確認できる。

$ dirs -l
/Users/sugyan/temp /usr/bin /Users/sugyan
$ dirs -lp
/Users/sugyan/temp
/usr/bin
/Users/sugyan
$ dirs -lpv
0       /Users/sugyan/temp
1       /usr/bin
2       /Users/sugyan

"pushd {+|-}N"記法で番号を指定してスタックの先頭に持ってきたりできる(これも"push"っぽくない挙動だなーと思うけど)

$ dirs -lpv
0       /
1       /Users/sugyan/temp
2       /usr
3       /usr/bin
4       /Users/sugyan
$ pushd -1
/usr/bin ~ / ~/temp /usr
$ dirs -lpv
0       /usr/bin
1       /Users/sugyan
2       /
3       /Users/sugyan/temp
4       /usr
$ pushd +1
~ / ~/temp /usr /usr/bin
$ dirs -lpv
0       /Users/sugyan
1       /
2       /Users/sugyan/temp
3       /usr
4       /usr/bin

"popd"コマンドはディレクトリスタックからpopして移動していく。

$ dirs -lpv
0       /Users/sugyan
1       /
2       /Users/sugyan/temp
3       /usr
4       /usr/bin
$ popd
/ ~/temp /usr /usr/bin
$ popd
~/temp /usr /usr/bin
$ popd
/usr /usr/bin
$ popd
/usr/bin
$ popd
popd: directory stack empty

ディレクトリ移動に関するシェルオプション

AUTO_CD

ディレクトリ名を入力するだけでそこにcdできるようになる

$ $HOME
zsh: permission denied: /Users/sugyan
$ setopt autocd
$ $HOME
$ pwd
/Users/sugyan
$ temp
$ pwd
/Users/sugyan/temp
AUTO_PUSHD

ディレクトリ移動時に常に元いたディレクトリをディレクトリスタックに積むようになる

$ dirs
~
$ cd /
$ cd /bin
$ cd ~
$ dirs
~
$ setopt autopushd
$ cd /
$ cd /bin
$ cd $HOME
$ dirs -lpv
0       /Users/sugyan
1       /bin
2       /
3       /Users/sugyan
PUSHD_IGNORE_DUPS

同じディレクトリを重複してスタックに積まないようになる

PUSHD_SILENT

pushd, popdしたときにdirsを表示しないようになる

…などなど。