shell

シェル作業スタイル: cd しないことで作業効率をn倍向上する

この記事は、株式会社ACCESS Advent Calendar 2017の1日目の記事です。


あらまし

みなさんはmacOSやLinuxで作業するとき、カレントディレクトリをどのタイミングで変えていますか?

私がカレントディレクトリを変える(cdする)のは以下のタイミングのみです。
* 作業対象のルートへ移動するとき(Gitリポジトリなど)
* カレントディレクトリを見るプログラムを実行するとき(Git, pwdの値をみるシェルスクリプトなど)

これ以外のタイミングでcdするのは極めて愚行です。

cdで失われるもの

cdで失われ得る大きなものの1つが、ヒストリバックの再利用性です。

過去に実行したコマンドライン文字列に相対パスが含まれている場合、
cdすることで相対パスがずれるため一度書き換える必要が出てきます。無駄ですよね

ls a/ # ディレクトリaに用事があった

cd c/d # ディレクトリc/d/e.txtに用事があったが、愚かにもcdした
cat e.txt

ls ../../a # またディレクトリaに用事があったが、cdしているために相対パスを書き換えなければいけなくなった

# or

cd ../../ # または元に戻ってからヒストリバックを呼び出す; 2コマンドになってしまった
ls a/

カレントディレクトリを関心のあるファイルのパスに置きたくなる気持ちはわからないではないですが、
打ちこむコマンドが増えるのは明白なのでやめましょう。

ターミナル

大きなリポジトリの中の深いところにあるファイル群を参照したいケースはcdしたくなります。
また、複数のプロジェクトをいったり来たりするときも、cdしたくなりますね。cdしないとGit動かないんで。

そういう時は、今のシェルでcdせず、新しくターミナルを立ち上げましょう
gnome-terminalならCtrl-Shift-T, iTerm2ならCmd-Tです。
screentmuxでもいいでしょう。

それにより、ターミナルの切り替えで一瞬にしてディレクトリ移動が可能になります。

私の場合、その時使うプロジェクトの数だけiTerm2のタブを作って作業しています。

make とか

make コマンドに代表されるコマンドは、カレントディレクトリにあるファイルを処理の対象とします。Makefileとか。
そのため、cd a/; make; cd - としている人もいると思います。惜しい

この手のコマンドはカレントディレクトリを移動してから処理を始めてくれるオプションが大抵用意されています(または処理対象のファイルパスをダイレクトに指定)。

make -C target # cd target; make; cd - と同等

これを使えば、cdしなくともカレントディレクトリにないMakefileを処理できます。

絶対パス

デメリットに相対パスが使えなくなることを挙げましたが、絶対パスを使うのもひとつの手です。

成果

私はこのプラクティスを入社後から実践した結果、コマンドの再利用率は常に9割を超え、コマンドをいちいち打つことがほとんどなくなりました。
大抵のコマンドはC-rC-pで出てきたものを実行するか、それを少しいじるだけで済ませてます。


明日も @katoken-0215 です。お楽しみに!