- Linux
Linuxのcd・pwdコマンドの使い方|相対パスと絶対パスの違いを図解
cdは「作業する場所(カレントディレクトリ)を移動する」コマンド、pwdは「いまいる場所をフルパスで表示する」コマンドです。 この2つはセットで覚えると迷いません。cdで動いたら、pwdで現在地を確かめる。これがLinuxのディレクトリ操作の基本の流れです。
この記事では、1つのディレクトリツリー図を最後まで使い回し、同じ移動を絶対パスと相対パスの両方で書いた対応表と、各コマンドのあとのpwdの出力をそのまま載せています。さらに、cd ~・cd -・cd ..・cd ../.. の移動先早見表、シンボリックリンクの上でpwd -Lとpwd -Pの結果が変わる様子、よく出会う4つのエラーの再現と直し方まで、すべてUbuntu 24.04(bash 5.2.21)で実行した結果つきでまとめました。コードはそのままコピーして試せます。
cd・pwdコマンドの早見表
まずは「これだけ見れば用が足りる」一覧です。移動先の列は、後半の検証で実際に確かめた結果にもとづいています。
| やりたいこと | コマンド | 補足 |
|---|---|---|
| いまいる場所を表示する | pwd |
フルパス(絶対パス)で表示される |
| リンクをたどった本来の場所を表示する | pwd -P |
シンボリックリンクを解決した物理パス |
| リンク名のままの場所を表示する | pwd -L |
オプションなしのpwdと同じ(bashの既定) |
| 絶対パスで移動する | cd /var/log |
先頭が /。どこにいても同じ場所へ行く |
| 相対パスで移動する | cd shop/app |
いまいる場所から見た道順 |
| ホームディレクトリへ戻る | cd または cd ~ |
引数なしのcdはホームへ移動 |
| ホーム配下へ移動する | cd ~/work |
~ は自分のホームに置き換わる |
| 1つ上へ移動する | cd .. |
.. は親ディレクトリ |
| 2つ上へ移動する | cd ../.. |
.. を / でつなぐ |
| 隣のディレクトリへ移動する | cd ../logs |
1つ上がってから logs に入る |
| 直前にいた場所へ戻る | cd - |
移動先のパスが1行表示される |
| 一番上(ルート)へ移動する | cd / |
ルートで cd .. をしても / のまま |
| 空白を含む名前へ移動する | cd "my docs" |
引用符で囲む。cd my\ docs でも可 |
| リンクを解決して移動する | cd -P current |
移動後のpwdが物理パスになる |
| 場所を覚えてから移動する | pushd /tmp |
popd で覚えた場所へ戻る |
| 移動できたときだけ続きを実行する | cd dir && コマンド |
スクリプトで定番の書き方 |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linuxのcd・pwdコマンドの使い方|相対パスと絶対パスの違いを図解」
この記事で使うディレクトリツリー図と検証環境
説明はすべて、次の1つのツリーで行います。架空の「shop」というアプリのフォルダを想定した、中立な例です。
/tmp/t199home ← 検証用ユーザーのホームディレクトリ(~)
└── work
├── current -> shop/app ← シンボリックリンク(shop/app を指す)
├── memo.txt ← ファイル
├── my docs ← 名前に空白を含むディレクトリ
├── secret ← 権限がなく入れないディレクトリ
└── shop
├── app
│ ├── logs
│ └── src
│ └── main.sh
└── docs
└── guide.md
同じ構造を図にすると次のとおりです。
graph TD
R["/(ルート)"] --> T["tmp"]
T --> H["t199home(ホーム ~)"]
H --> W["work"]
W --> S["shop"]
W --> M["memo.txt(ファイル)"]
W --> D["my docs(空白入り)"]
W --> X["secret(権限なし)"]
W -.->|"シンボリックリンク"| C["current"]
C -.-> A
S --> A["app"]
S --> O["docs"]
A --> SR["src"]
A --> L["logs"]
検証環境は次のとおりです。
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04.4 LTS |
| シェル | GNU bash 5.2.21 |
| pwd(外部コマンド版) | GNU coreutils 9.4 の /bin/pwd |
| ユーザー | 一般ユーザー(rootではない) |
| ホームディレクトリ | /tmp/t199home(検証用に用意した場所) |
ふだんのホームディレクトリは /home/ユーザー名 です。この記事の出力に出てくる /tmp/t199home は、ご自身の環境の /home/ユーザー名 に読み替えてください。
同じツリーを手元に作るには、次をそのまま貼り付けます。
mkdir -p ~/work/shop/app/src ~/work/shop/app/logs ~/work/shop/docs ~/work/"my docs"
touch ~/work/memo.txt ~/work/shop/docs/guide.md ~/work/shop/app/src/main.sh
ln -s shop/app ~/work/current
mkdir ~/work/secret && chmod 000 ~/work/secret
片付けるときは chmod 755 ~/work/secret で権限を戻してから rm -r ~/work を実行します。
pwdで「いまいる場所」を確認する
pwdは print working directory の略で、カレントディレクトリを絶対パスで1行表示します。 オプションなしで使うことがほとんどです。
cd ~/work
pwd
実行結果:
/tmp/t199home/work
シェルは現在地を環境変数 PWD にも入れています。スクリプトの中では $PWD を使うと、pwdを呼ばずに現在地を参照できます。
echo $PWD; echo $HOME
実行結果:
/tmp/t199home/work
/tmp/t199home
| pwdの書き方 | 意味 |
|---|---|
pwd |
論理パス(リンク名を残したパス)を表示。bashでは pwd -L と同じ |
pwd -L |
論理パスを表示 |
pwd -P |
物理パス(シンボリックリンクをたどった本来のパス)を表示 |
echo $PWD |
シェルが覚えている現在地。pwd -L と同じ内容 |
/bin/pwd |
シェル組み込みではない外部コマンド版。手元では物理パスを表示した |
-L と -P の違いは、シンボリックリンクの章で実行結果とあわせて説明します。
絶対パスと相対パスの違い
絶対パスは「ルート(/)から数えた住所」、相対パスは「いまいる場所から見た道順」です。 見分け方は1つだけで、先頭が / なら絶対パス、それ以外は相対パスです(~ で始まるパスは、シェルがホームの絶対パスに置き換えるので絶対パスの仲間です)。
| 観点 | 絶対パス | 相対パス |
|---|---|---|
| 書き出し | / で始まる |
/ 以外で始まる(名前、.、..) |
| 基準 | 常にルート | いまいるディレクトリ |
| 例 | /tmp/t199home/work/shop/docs |
../../docs |
| 現在地が変わると | 同じ場所を指し続ける | 指す場所が変わる |
| 長さ | 長くなりやすい | 近い場所なら短い |
| 向いている場面 | スクリプト、設定ファイル、手順書 | 手元での対話的な移動 |
相対パスで使う記号は3つ覚えれば足ります。
| 記号 | 意味 | 例 |
|---|---|---|
. |
いまいるディレクトリ | cd ./src(cd src と同じ) |
.. |
1つ上(親)のディレクトリ | cd ..、cd ../logs |
~ |
自分のホームディレクトリ | cd ~/work |
同じ移動を絶対パスと相対パスの両方で書いた対応表
ツリー図を見ながら、同じ移動を2通りで書いてみます。どちらで書いても、移動後のpwdは同じになります。
| 出発地(いまいる場所) | 目的地 | 絶対パスで書く | 相対パスで書く | 移動後のpwd |
|---|---|---|---|---|
| app/src | app/logs | cd /tmp/t199home/work/shop/app/logs |
cd ../logs |
/tmp/t199home/work/shop/app/logs |
| app/logs | shop/docs | cd /tmp/t199home/work/shop/docs |
cd ../../docs |
/tmp/t199home/work/shop/docs |
| shop/docs | work | cd /tmp/t199home/work |
cd ../.. |
/tmp/t199home/work |
| work | shop/app | cd /tmp/t199home/work/shop/app |
cd shop/app |
/tmp/t199home/work/shop/app |
| shop/app | app/src | cd /tmp/t199home/work/shop/app/src |
cd ./src または cd src |
/tmp/t199home/work/shop/app/src |
| app/src | my docs | cd "/tmp/t199home/work/my docs" |
cd ../../../"my docs" |
/tmp/t199home/work/my docs |
相対パスの列を順番に実行した結果が次です。1行ごとにpwdで現在地を確かめています。
cd /tmp/t199home/work/shop/app/src
pwd
cd ../logs
pwd
cd ../../docs
pwd
cd ../..
pwd
cd shop/app
pwd
cd ./src
pwd
cd ../../../"my docs"
pwd
実行結果($ の行が入力、その下が出力):
$ cd /tmp/t199home/work/shop/app/src
$ pwd
/tmp/t199home/work/shop/app/src
$ cd ../logs
$ pwd
/tmp/t199home/work/shop/app/logs
$ cd ../../docs
$ pwd
/tmp/t199home/work/shop/docs
$ cd ../..
$ pwd
/tmp/t199home/work
$ cd shop/app
$ pwd
/tmp/t199home/work/shop/app
$ cd ./src
$ pwd
/tmp/t199home/work/shop/app/src
$ cd ../../../"my docs"
$ pwd
/tmp/t199home/work/my docs
相対パスの読み方(../../docs を分解する)
../../docs は左から順に読みます。app/logs にいる場合、次のように進みます。
| 順番 | 読む部分 | 動き | その時点の場所 |
|---|---|---|---|
| 0 | (出発) | ― | /tmp/t199home/work/shop/app/logs |
| 1 | .. |
1つ上へ | /tmp/t199home/work/shop/app |
| 2 | .. |
さらに1つ上へ | /tmp/t199home/work/shop |
| 3 | docs |
docs に入る | /tmp/t199home/work/shop/docs |
「.. は上へ1歩、名前は下へ1歩」と読めば、どんな相対パスでも分解できます。 ツリー図の線を指でなぞるのと同じ動きです。
絶対パスと相対パスの選び方
| 場面 | おすすめ | 理由 |
|---|---|---|
| ターミナルで近くへ移動する | 相対パス | 短く打てる |
| シェルスクリプトやcronに書く | 絶対パス | 実行時の現在地に左右されない |
| 手順書やチャットで場所を伝える | 絶対パス | 読む人の現在地がわからないため |
| 遠く離れた場所へ移動する | 絶対パス | .. を数えるより確実 |
| ホーム配下へ移動する | ~/... |
短く、ユーザー名が変わっても通用する |
| 同じ構成のフォルダを別の場所でも使う | 相対パス | フォルダごと移しても道順が変わらない |
cd ~・cd -・cd ..・cd ../.. の移動先早見表
記号を使ったcdの移動先を、実際に実行して確かめた結果です。出発地はすべて /tmp/t199home/work/shop/app/src です。
| コマンド | 移動先 | 移動後のpwd |
|---|---|---|
cd |
ホームディレクトリ | /tmp/t199home |
cd ~ |
ホームディレクトリ | /tmp/t199home |
cd ~/work |
ホームの下の work | /tmp/t199home/work |
cd . |
いまいる場所(動かない) | /tmp/t199home/work/shop/app/src |
cd .. |
1つ上 | /tmp/t199home/work/shop/app |
cd ../.. |
2つ上 | /tmp/t199home/work/shop |
cd ../../.. |
3つ上 | /tmp/t199home/work |
cd ../logs |
隣のディレクトリ | /tmp/t199home/work/shop/app/logs |
cd / |
ルート | / |
cd - |
直前にいた場所 | (直前の場所。次の節を参照) |
cd ../.. と cd ../../.. の実行結果です。
$ cd /tmp/t199home/work/shop/app/src
$ cd ../..
$ pwd
/tmp/t199home/work/shop
$ cd /tmp/t199home/work/shop/app/src
$ cd ../../..
$ pwd
/tmp/t199home/work
ルートより上はないので、ルートで cd .. を実行しても場所は変わりません。エラーにもなりません。
$ cd /
$ pwd
/
$ cd ..
$ pwd
/
末尾に / を付けても付けなくても、移動先は同じです。
$ cd /tmp/t199home/work/shop/app/src/
$ pwd
/tmp/t199home/work/shop/app/src
cd - で直前の場所と行き来する
cd - は「直前にいたディレクトリ」へ戻るコマンドで、移動先のパスを1行表示してくれます。 2つの場所を行き来するときに便利です。
cd /tmp/t199home/work/shop/app/src
cd
pwd
cd -
cd -
echo $OLDPWD
実行結果:
$ cd /tmp/t199home/work/shop/app/src
$ cd
$ pwd
/tmp/t199home
$ cd -
/tmp/t199home/work/shop/app/src
$ cd -
/tmp/t199home
$ echo $OLDPWD
/tmp/t199home/work/shop/app/src
cd - を繰り返すと、2つの場所を交互に移動します。直前の場所は環境変数 OLDPWD に入っていて、cd - は cd "$OLDPWD" を実行してからpwdを表示するのと同じ動きです。覚えているのは1つ前だけなので、3か所以上を行き来したいときは後述の pushd・popd を使います。
~ の使い方(自分のホームとほかのユーザーのホーム)
~ 単体は自分のホーム、~ユーザー名 はそのユーザーのホームに置き換わります。一般ユーザーが cd ~root を実行すると、rootのホーム(/root)に置き換わったうえで、権限がないため次のようになりました。
$ cd ~root
bash: cd: /root: Permission denied
エラーメッセージに /root と出ていることから、~root が /root に展開されたことがわかります。
シンボリックリンクの上では pwd -L と pwd -P の結果が変わる
シンボリックリンクは、別の場所を指す「近道」のようなものです。ツリー図の current は shop/app を指しています。
$ cd ~/work
$ ls -l current
lrwxrwxrwx 1 nobody nogroup 8 Oct 2 20:22 current -> shop/app
このリンクを通って移動すると、pwd(-L)は「通ってきたリンク名のパス」を、pwd -P は「リンクをたどった本来のパス」を表示します。
cd current
pwd
pwd -L
pwd -P
/bin/pwd
echo $PWD
実行結果:
$ cd current
$ pwd
/tmp/t199home/work/current
$ pwd -L
/tmp/t199home/work/current
$ pwd -P
/tmp/t199home/work/shop/app
$ /bin/pwd
/tmp/t199home/work/shop/app
$ echo $PWD
/tmp/t199home/work/current
| コマンド | 表示されたパス | 種類 |
|---|---|---|
pwd |
/tmp/t199home/work/current | 論理パス |
pwd -L |
/tmp/t199home/work/current | 論理パス |
echo $PWD |
/tmp/t199home/work/current | 論理パス |
pwd -P |
/tmp/t199home/work/shop/app | 物理パス |
/bin/pwd |
/tmp/t199home/work/shop/app | 物理パス |
同じ場所にいるのに、表示が2通りあります。ディスク上の本来の場所は1つ(shop/app)で、論理パスは「シェルが覚えている道順」、物理パスは「OSから見た本来の場所」という違いです。シェル組み込みのpwdと外部コマンドの /bin/pwd で既定の表示が違った点も、手元の結果として押さえておくと役に立ちます。
リンクの上での cd .. は「来た道」を戻る
リンクの中で cd .. をすると、どこへ行くでしょうか。bashの既定(-L)では、論理パスの1つ上、つまりリンクが置いてある場所へ戻ります。
$ cd current
$ cd ..
$ pwd
/tmp/t199home/work
cd -P .. と書くと、物理パスの1つ上(本来の親ディレクトリ)へ移動します。
$ cd current
$ cd -P ..
$ pwd
/tmp/t199home/work/shop
また、移動するときに cd -P を使うと、最初から物理パスに入ります。
$ cd ~/work
$ cd -P current
$ pwd
/tmp/t199home/work/shop/app
| 操作(current の中から) | 移動先 | 考え方 |
|---|---|---|
cd .. |
/tmp/t199home/work | 来た道(論理パス)を1つ戻る |
cd -P .. |
/tmp/t199home/work/shop | 本来の場所(物理パス)の親へ |
1つ注意したいのは、cd以外のコマンドは物理パスで .. を解釈することです。current/src にいるときの ls .. は、本来の親である app の中身を表示しました。
$ cd ~/work/current/src
$ pwd
/tmp/t199home/work/current/src
$ pwd -P
/tmp/t199home/work/shop/app/src
$ ls ..
logs
src
この例ではcdもlsも同じ app を見ていますが、リンクの直下で .. を使うと、cdは work、lsなどのコマンドは shop を見ることになります。リンクの上で相対パスを使うときは、先に pwd -P で本来の場所を確かめると安心です。
リンクの指す先だけを知りたいとき
移動せずにリンクの本来の場所を調べるには、readlink -f か realpath を使います。
$ readlink -f ~/work/current
/tmp/t199home/work/shop/app
$ realpath ~/work/current
/tmp/t199home/work/shop/app
pwd -L と pwd -P の使い分け
| 場面 | 使うもの | 理由 |
|---|---|---|
| ふだんの現在地確認 | pwd |
自分が入力した道順と同じ表示でわかりやすい |
| リンクの本来の場所を知りたい | pwd -P |
ディスク上の位置がわかる |
| ログや設定に現在地を書き残す | pwd -P |
リンクが張り替えられても意味が変わらない |
| スクリプトで現在地を変数に入れる | dir=$(pwd -P) |
物理パスで統一すると比較しやすい |
| 2つのパスが同じ場所か確かめる | 両方を realpath に通す |
リンク経由でも同じ結果になる |
cdでよく出会うエラー4つと直し方
ここからは、cdのエラーを実際に再現し、直し方を並べます。出発地はすべて ~/work です。エラーが出たとき、cdは移動せず元の場所にとどまり、終了ステータスは1になります。
| エラーメッセージ | 主な原因 | 直し方 |
|---|---|---|
| No such file or directory | 名前の打ち間違い、大文字と小文字の違い、現在地の勘違い | pwd と ls で確かめる。Tab補完を使う |
| Not a directory | ディレクトリではなくファイルを指定した | ls -l で種類を確かめ、親ディレクトリへ移動する |
| Permission denied | そのディレクトリに入る権限(x)がない | ls -ld で権限を確かめ、管理者に相談するか権限を調整する |
| too many arguments | 空白を含む名前を引用符なしで書いた | "..." で囲むか \ で空白をエスケープする |
1. No such file or directory(そのような場所がない)
$ cd shpo
bash: cd: shpo: No such file or directory
$ cd Shop
bash: cd: Shop: No such file or directory
1つ目は shop の打ち間違い、2つ目は大文字の S が原因です。Linuxは大文字と小文字を別の文字として扱うため、Shop と shop は別の名前です。終了ステータスも確かめておきます。
$ cd shpo; echo "status=$?"
bash: cd: shpo: No such file or directory
status=1
直し方は次の順で確かめます。
pwd # 1. いまどこにいるかを確かめる
ls # 2. そこに何があるかを確かめる
cd shop # 3. 表示された名前のとおりに入力する
相対パスは現在地が基準なので、「名前は合っているのに見つからない」ときは、現在地が思っていた場所と違うことがほとんどです。pwdを先に実行すると原因がすぐわかります。また、名前の途中までを入力してTabキーを押すと、シェルが残りを補ってくれるので、打ち間違いそのものを減らせます(Tab補完はキー操作のため、この記事では出力を載せていません)。
2. Not a directory(ディレクトリではない)
$ cd memo.txt
bash: cd: memo.txt: Not a directory
cdで入れるのはディレクトリだけです。ls -l で先頭の文字を見ると種類がわかります。
| ls -l の先頭の文字 | 種類 | cdできるか |
|---|---|---|
d |
ディレクトリ | できる |
- |
通常のファイル | できない(Not a directory) |
l |
シンボリックリンク | 指す先がディレクトリならできる |
ファイルの中身を見たいときは cat memo.txt や less memo.txt を、ファイルのある場所へ行きたいときは親ディレクトリへcdします。
3. Permission denied(権限がない)
$ cd secret
bash: cd: secret: Permission denied
$ ls -ld secret
d--------- 2 nobody nogroup 4096 Oct 2 20:22 secret
ディレクトリに入るには、そのディレクトリの実行権限(x)が必要です。 ls -ld の結果が d--------- となっていて、だれにも x が付いていないことがわかります。
| 状況 | 直し方 |
|---|---|
| 自分が所有者のディレクトリ | chmod u+x secret(読み書きも必要なら chmod 755 secret) |
| ほかのユーザーやシステムのディレクトリ | 管理者に必要な権限を相談する。中を見るだけなら sudo ls /対象 で足りることも多い |
| rootのホーム(/root)など | 一般ユーザーは入れない設計。必要な作業だけを sudo で行う |
sudo cd secret と書いても移動はできません。cdはシェルに組み込まれたコマンドで、sudoは別のプログラムとして実行する仕組みだからです(cdが組み込みであることは、後述の type cd で確かめています)。
4. 空白を含む名前で too many arguments になる
$ cd my docs
bash: cd: too many arguments
シェルは空白で引数を区切るので、cd my docs は「my と docs の2つの引数」と解釈されます。cdが受け取れる移動先は1つなので、このメッセージになります。同じ理由で、移動先を2つ並べたときも同じ結果です。
$ cd shop docs
bash: cd: too many arguments
直し方は3通りあり、どれでも同じ結果になります。
cd "my docs" # ダブルクォートで囲む
cd 'my docs' # シングルクォートで囲む
cd my\ docs # 空白の前にバックスラッシュを置く
実行結果:
$ cd "my docs"
$ pwd
/tmp/t199home/work/my docs
$ cd ..
$ cd my\ docs
$ pwd
/tmp/t199home/work/my docs
$ cd ..
$ cd 'my docs' && pwd
/tmp/t199home/work/my docs
スクリプトで変数を使うときも同じで、cd "$dir" のように変数をダブルクォートで囲むと、空白を含む名前でもそのまま移動できます。
そのほかのメッセージ
| メッセージ | 再現したコマンド | 意味と直し方 |
|---|---|---|
| invalid option | cd -x |
cdにないオプション。使えるのは -L と -P など。名前が - で始まるディレクトリは cd ./-x または cd -- -x と書く |
| error retrieving current directory | 削除済みのディレクトリで pwd -P |
いまいるディレクトリが消えている。cd ~ など、実在する場所へ絶対パスで移動する |
cd -x の実行結果です。使い方(usage)も表示されます。
$ cd -x
bash: cd: -x: invalid option
cd: usage: cd [-L|[-P [-e]] [-@]] [dir]
いまいるディレクトリが別の操作で削除された場合は、次のようになりました。論理パスを表示する pwd は覚えているパスをそのまま表示しますが、pwd -P は本来の場所を調べに行くため、メッセージが出ます。
$ pwd
/tmp/t199home/work/tmpdir
$ pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
$ cd ~/work
$ pwd
/tmp/t199home/work
シェルスクリプトでcdを使うときの3つのポイント
1. cd が成功したときだけ続きを実行する
スクリプトでは、cdできなかったのに次のコマンドが動くと、意図しない場所でファイルを操作することになります。cd ディレクトリ && コマンド と書くと、移動できたときだけ続きが実行されます。
$ cd nodir && echo "ここで作業"
bash: cd: nodir: No such file or directory
$ cd nodir || { echo "移動できないので中止"; }
bash: cd: nodir: No such file or directory
移動できないので中止
1つ目は echo が実行されていません。スクリプトでは次の形が定番です。
#!/bin/bash
cd /var/app/data || { echo "移動できません: /var/app/data" >&2; exit 1; }
# ここから下は /var/app/data にいることが確かな状態で実行される
ls
2. 一時的に移動したいときは丸かっこ(サブシェル)を使う
丸かっこで囲むと、その中だけ別のシェルで実行されます。かっこの中でcdしても、外側の現在地は変わりません。
$ (cd shop && pwd)
/tmp/t199home/work/shop
$ pwd
/tmp/t199home/work
「別の場所で1つだけコマンドを実行して、すぐ元の場所で続けたい」ときに、戻るためのcdを書かずに済みます。
3. スクリプトの中のcdは、呼び出した側の現在地を変えない
次の2行だけのスクリプト go.sh を用意します。
#!/bin/bash
cd /tmp
pwd
これを普通に実行した場合と、source で読み込んだ場合を比べます。
$ ./go.sh
/tmp
$ pwd
/tmp/t199home/work
$ source ./go.sh
/tmp
$ pwd
/tmp
| 実行方法 | スクリプト内のpwd | 実行後の自分の現在地 | 理由 |
|---|---|---|---|
./go.sh |
/tmp | 変わらない | 別のプロセスで実行され、現在地はプロセスごとに持つため |
source ./go.sh |
/tmp | /tmp に変わる | いまのシェル自身がスクリプトを読んで実行するため |
「スクリプトでcdしたのに移動していない」という疑問は、この仕組みで説明できます。よく行く場所へ一発で移動したいときは、スクリプトではなくエイリアスや関数を .bashrc に書くのが定番です。
# ~/.bashrc に追記する例
alias cdw='cd ~/work'
pushd・popdで複数の場所を行き来する
cd - が覚えているのは1つ前だけです。pushdは「いまの場所を覚えてから移動」、popdは「覚えた場所へ戻る」コマンドで、覚えた場所は積み重ね(ディレクトリスタック)として管理されます。
cd ~/work
pushd shop/app/src
pushd /tmp
dirs -v
popd
popd
pwd
実行結果:
$ pushd shop/app/src
~/work/shop/app/src ~/work
$ pushd /tmp
/tmp ~/work/shop/app/src ~/work
$ dirs -v
0 /tmp
1 ~/work/shop/app/src
2 ~/work
$ popd
~/work/shop/app/src ~/work
$ popd
~/work
$ pwd
/tmp/t199home/work
pushdやpopdを実行するたびに、覚えている場所の一覧が左から新しい順に表示されます。一番左が現在地です。
| コマンド | 動き |
|---|---|
pushd ディレクトリ |
現在地を覚えてから、指定した場所へ移動する |
popd |
一番上の記録を取り除き、その下の場所へ戻る |
dirs -v |
覚えている場所を番号つきで一覧表示する |
cd - |
1つ前の場所へ戻る(覚えているのは1つだけ) |
| 行き来したい場所の数 | おすすめ |
|---|---|
| 2か所 | cd - |
| 3か所以上、または「あとで必ずここへ戻る」 | pushd と popd |
| 1つのコマンドだけ別の場所で実行 | (cd 場所 && コマンド) |
知っておくと便利な補足
cdとpwdはシェルに組み込まれたコマンド
$ type cd pwd
cd is a shell builtin
pwd is a shell builtin
$ type -a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd
cdはシェル自身の現在地を変える必要があるため、外部プログラムではなくシェルの組み込みコマンドになっています。pwdは組み込み版と外部コマンド版の両方があり、名前だけで実行すると組み込み版が使われます。オプションの説明は、bashでは help cd、help pwd で確認できます。
CDPATHを設定すると、どこからでも名前だけで移動できる
環境変数 CDPATH にディレクトリを登録すると、cdは現在地に加えてその中も探します。CDPATH経由で移動したときは、移動先が1行表示されます。
$ CDPATH=~/work/shop; cd docs
/tmp/t199home/work/shop/docs
$ pwd
/tmp/t199home/work/shop/docs
便利な一方で、スクリプトの中では思わぬ場所へ移動する原因になることがあります。CDPATHは対話的に使うシェル(.bashrc)だけで設定し、スクリプトでは絶対パスを使うと安定します。
cdとpwdのオプション一覧(bash)
| コマンド | オプション | 意味 |
|---|---|---|
| cd | -L |
論理パスで移動する(既定) |
| cd | -P |
シンボリックリンクを解決して物理パスで移動する |
| cd | - |
直前の場所(OLDPWD)へ移動し、移動先を表示する |
| cd | -- |
これ以降をオプションとして扱わない(- で始まる名前用) |
| pwd | -L |
論理パスを表示する(bash組み込みの既定) |
| pwd | -P |
物理パスを表示する |
迷ったときのチェックリスト
| 確認すること | コマンド |
|---|---|
| いまどこにいるか | pwd |
| そこに何があるか | ls |
| 行き先はディレクトリか | ls -ld 行き先 |
| 入る権限があるか | ls -ld 行き先 の先頭(x が付いているか) |
| 名前に空白や記号がないか | ls -1 で1行ずつ表示して確かめる |
| リンクを通っていないか | pwd -P |
| とにかく最初に戻りたい | cd(ホームへ) |
よくある質問
Q. cd と cd ~ は何が違いますか?
A. 移動先は同じで、どちらもホームディレクトリです。引数なしのcdは環境変数HOMEの場所へ移動し、~ はシェルがHOMEの値に置き換えます。cd ~/work のように、ホーム配下のパスを短く書けるのが ~ の便利な点です。
Q. 相対パスと絶対パスは、どちらを使えばよいですか? A. ターミナルで近くへ移動するなら相対パス、スクリプトや手順書に書くなら絶対パスがおすすめです。相対パスは現在地によって指す場所が変わるので、だれがどこで実行しても同じ結果にしたい場合は絶対パスが向いています。
Q. pwd と pwd -P で結果が違うのはなぜですか? A. シンボリックリンクを通って移動したためです。pwdは通ってきたリンク名を含む論理パスを、pwd -P はリンクをたどった物理パスを表示します。リンクを通っていなければ、両者の結果は同じになります。
Q. cd - で表示されるパスは何ですか?
A. 移動先(直前にいた場所)のパスです。cd - は環境変数OLDPWDの場所へ移動し、移動後の現在地を1行表示します。繰り返すと2つの場所を交互に行き来できます。
まとめ
- cdは移動、pwdは現在地の表示。 動いたらpwdで確かめる流れを習慣にすると迷いません。
- 先頭が / なら絶対パス、それ以外は相対パス。 相対パスは「.. は上へ1歩、名前は下へ1歩」と読みます。
- cd(引数なし)と cd ~ はホームへ、cd .. は1つ上へ、cd ../.. は2つ上へ、cd - は直前の場所へ移動します。
- シンボリックリンクの上では、pwd は論理パス、pwd -P は物理パスを表示します。cd .. は来た道を戻り、cd -P .. は本来の親へ移動します。
- エラーは4種類を押さえる。 No such file or directory はpwdとlsで確認、Not a directory は ls -l で種類を確認、Permission denied は ls -ld で権限を確認、空白入りの名前は引用符で囲みます。
- スクリプトでは cd 場所 || exit 1 と絶対パスを使い、一時的な移動は丸かっこ(サブシェル)で囲みます。
- 3か所以上を行き来するなら pushd と popd が便利です。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linuxのcd・pwdコマンドの使い方|相対パスと絶対パスの違いを図解」
株式会社RJCでは、Linuxのcd・pwdコマンドやパスの考え方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。