3秒でわかる
作業中のディレクトリを移動するコマンド。ターミナルでの操作はすべて現在地からの相対で動くため、まず cd で目的の場所に立つことが出発点になります。
もう少し詳しく
どういうものか
cd は change directory の略で、シェルが「今どこにいるか」を示すカレントディレクトリを移すコマンドである。移動しても画面には何も表示されないが、pwd を打てば現在地が分かる。
引数の書き方は 2 通りある。/etc/nginx のようにルートから書く絶対パスと、今いる場所を起点にする相対パスである。相対パスでは . が現在地、.. が 1 つ上の階層、~ がホームディレクトリを指す。
なぜ必要か
コマンドの多くは、パスを省略すると現在地を対象にする。ls も npm install も git status も、どこで打つかで結果がまるで変わる。プロジェクトのルートではなくホームディレクトリで npm install を打ってしまい、身に覚えのない node_modules がホームに出来るのはよくある事故である。
つまり cd はファイル操作そのものではなく、これから打つコマンドの「宛先」を決める操作になる。
具体例
pwd # /home/sakura ── 今の場所を確認
cd projects/webapp # 相対パスで下へ
pwd # /home/sakura/projects/webapp
cd .. # 1 つ上へ (projects へ)
cd ../.. # 2 つ上へ
cd /var/log # 絶対パスで一気に移動
cd ~ # ホームへ (cd だけでも同じ)
cd - # 直前にいたディレクトリへ戻るcd - は覚えておくと効く。ログを見に /var/log へ飛んだあと、長いパスを打ち直さずに作業ディレクトリへ帰れる。
つまずきやすいところ
スペースを含むディレクトリ名でつまずく。cd My Documents は 2 つの引数と解釈されて失敗するので、cd "My Documents" と引用符で囲むか cd My\ Documents とエスケープする。
もう 1 つ、シェルスクリプトの中で cd しても、スクリプトを終えた後の親シェルの現在地は変わらない。スクリプトは子プロセスで動き、カレントディレクトリはプロセスごとに持つためである。呼び出し元の現在地を変えたい場合は source script.sh で同じシェル内で実行する。
覚え方
cd は「移動」ではなく「今いる場所の付け替え」と捉えると、スクリプト内の cd が外に響かない理由まで一続きで納得できる。