絶対パスと相対パス
絶対パスと相対パス とは
ファイルやディレクトリを指定する絶対パスと相対パスの違いを理解し、使い分けます。本レッスンでは、絶対パスと相対パス の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
Linuxではファイルを指し示す方法に絶対パスと相対パスの2種類があります。スクリプトの動作確認、ログの場所指定、Docker の WORKDIR の理解、CI/CD でビルド成果物を移動するときなど、現場でハマる多くの原因は「パスの起点を間違えている」ことです。本レッスンでは、起点の違いと使い分けの目安を実例で押さえます。
たとえば cron が予期せず動かないバグの大半は「相対パスで書いたスクリプトが、想定と違う場所から起動された」ことが原因です。逆に、リポジトリ内の補助スクリプトを絶対パスで書いてしまうと、別マシンに持って行くたびに書き換えが必要になってしまいます。両者の特性を理解して使い分けることが、移植性と信頼性の両方を守るカギです。
基本の定義
| 種類 | 起点 | 例 |
|---|---|---|
| 絶対パス | ルート / | /etc/hostname /var/log/syslog |
| 相対パス | 現在のディレクトリ | ./script.sh ../config/app.yml data/in.csv |
絶対パスは「住所の郵便番号付き表記」、相対パスは「ここから2軒先」のような表記とイメージできます。どちらが正解というわけではなく、状況に応じて選びます。
動作の図解
代表例
ターミナル
# 絶対パスでアクセス(どこにいても同じ結果)
$ cat /etc/hostname
myserverターミナル
# 相対パス(カレントディレクトリ依存)
$ cd /tmp
$ mkdir -p work/sub
$ echo hello > work/sub/b.txt
$ cat work/sub/b.txt
helloターミナル
# 親ディレクトリへ ..
$ cd /tmp/work/sub
$ cat ../sub/b.txt
helloターミナル
# 自分のホームをチルダで参照
$ ls ~/Documents 2>/dev/null || echo no docs特殊記号と頻出パターン
| 記号 | 意味 | 使用例 |
|---|---|---|
. | 現在地 | ./run.sh |
.. | 親 | ../config/app.yml |
~ | 自分のホーム | ~/.bashrc |
~user | 別ユーザーのホーム | ~alice/.ssh |
/ | ルート | /var/log/nginx |
使い分けの目安
- 絶対パスは「どこから実行しても同じ場所を指したい」スクリプトや cron、systemd の設定向け
- 相対パスは「リポジトリ内で完結する処理」やプロジェクト内の補助スクリプト向け
- 移植性とのバランスで決める
- 一時ディレクトリは
mktemp -dで作って絶対パスを変数に入れるとブレない
ターミナル
# スクリプト先頭で起点を固定する定番テクニック
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"この2行を入れておくと、どこから実行されてもスクリプトと同じディレクトリを起点にできます。
Docker / CI で起きる典型ミス
ターミナル
# Dockerfile では WORKDIR が現在地を決める
WORKDIR /app
COPY . .
RUN ./build.sh # ./ は /app からの相対CI でも同様で、Workflow ファイル内の run: は通常リポジトリのルートから走ります。自前のスクリプトがどこを起点にしているかを意識しないと「ローカルでは動くのに CI で落ちる」事故になります。
相対パスは便利ですが、cron や別ユーザーの実行では「現在地」が想像と違うことが多くあります。安全策として、スクリプト先頭で
cd "$(dirname "$0")"または絶対パスを使うとトラブルが減ります。
パスは住所と同じです。郵便番号から書くか、目印からの道順で書くか、状況に応じて適切な書き方を選びましょう。
パスの正規化
.. や . が混ざった複雑なパスは、realpath で正規化された絶対パスに変換できます。
ターミナル
$ cd /tmp && mkdir -p a/b
$ realpath a/b/../b
/tmp/a/bスクリプトで「ユーザーが渡したパスを信頼できる絶対パスに直してから扱う」ときに重宝します。
やってみよう
演習エディタで /tmp に深いディレクトリを掘り、絶対パスと相対パスの両方で同じファイルにアクセスできることを確かめましょう。pwd で起点を確認しながら進めると感覚がつかめます。cd で別の場所に移動した後、同じ相対パスを使うと別のファイルを指してしまう、という体験もぜひ。
まとめ
- 絶対パスは
/から、相対パスは現在地から書き始める ...~/を組み合わせて柔軟に指し示せる- スクリプトやcronでは絶対パスが安全
- 開発中は相対パスが軽快、本番運用では絶対パスが安心
- スクリプト先頭で起点を固定するイディオムを覚えておく
次のレッスン
次は ファイルの中身を見る で、ファイルやディレクトリを指定する絶対パスと相対パスの違いを理解し、使い分けます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 絶対パス / 相対パス の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 絶対パス / 相対パス とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- 絶対パスでファイル作成
- cd 後に相対パスで cat
- hello が出力される