Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

ZshでChange DirectoryしたときにList Segmentsする

Zshでcdしたときにlsされると便利かな~って思って適当に実装してみた。

手っ取り早く考えたのがこれ

alias cd="cd $1 ls"

まあコレはちゃんと動かないんですけどね。

エイリアスは引数を取れないので、問答無用でホームディレクトリ帰され、lsに引数が渡されたことになります。

$ cd hoge/

これが

$ cd && ls hoge/

こうなる(┐「ε:)ズコー====


次に考えたのがこれ

alias cd="cdls"
function cdls() {
  cd $1 && ls
}

いけそうな気がする・・

cdls:1: maximum nested function level reached

が……駄目っ……!

コレはcdのエイリアスが有効であるため、再帰的にcdが呼ばれ続けてエラーを吐いている。

と言う訳でbuiltinを使いましょう。

builtinはユーザ実装の関数やエイリアスよりシェル・コマンドを優先的に実行するためのコマンドです。

alias cd="cdls"
function cdls() {
  builtin cd $1 && ls
}

これでエイリアスのcdではなく、シェル・コマンドのcdが呼ばれるようになります。

akata:^_^[~]$ cd hoge
bar  foo  hoge  huga
akata:^_^[~/hoge]$

(∩´∀`)∩ワーイいけました。

ちなみにこれだとlsコマンドの方はエイリアスが有効になっているので、
既存のエイリアスを使い回せます。

後、確認していませんが多分Bashでもちゃんと動くと思います(タブンネ..)

参考URL

Linuxコマンド集 - 【 builtin 】 シェル・コマンドを優先して実行する:ITpro

ここに知りたいことは全部書いていました。