今日はディレクトリ操作。
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を表示しないようになる
…などなど。