LinuxやmacOSなどのターミナルでBashを利用している際、多くの操作は「現在自分がどのディレクトリにいるのか」を前提に行われます。
ディレクトリを頻繁に移動していると、今作業している場所がどこなのか確信が持てなくなることもあるでしょう。
そのような場面で最も頻繁に利用され、かつ基本的なコマンドがpwdコマンドです。
本記事では、Bashにおける現在地の確認方法から、pwdコマンドの便利なオプション、シンボリックリンクを扱う際の注意点まで詳しく解説します。
pwdコマンドとは:現在地を確認する基本
Bashにおけるpwdコマンドは、Print Working Directoryの略称であり、その名の通り現在の作業ディレクトリ(カレントディレクトリ)のパスを標準出力に表示するコマンドです。
Linuxのディレクトリ構造はルートディレクトリ(/)を頂点としたツリー構造になっており、ユーザーがいまツリーのどの枝に位置しているかを把握することは、ファイルのコピーや削除、プログラムの実行において極めて重要です。
操作ミスを防ぐためにも、不慣れな環境や複雑なディレクトリ構成下では、まずpwdコマンドで現在地を確認する習慣をつけましょう。
基本的な使い方
pwdコマンドの使い方は非常にシンプルです。
引数なしで実行するだけで、現在のディレクトリの絶対パスが表示されます。
# 現在のディレクトリを確認する
pwd
/home/user/documents/projects
このように、ルートディレクトリから現在の場所までの道のりが絶対パスで示されます。
pwdコマンドのオプション活用:論理パスと物理パス
pwdコマンドには、主に2つの重要なオプションが存在します。
これらは、特にシンボリックリンク(ショートカットのようなもの)を経由してディレクトリを移動している場合に挙動が異なります。
Bashの組み込みコマンドとしてのpwdは、デフォルトで物理的な位置ではなく、移動の経緯を反映した論理的な位置を表示します。
-Lオプション(論理パス)
-Lオプションは、Logical(論理的)なパスを表示します。
これはpwdコマンドのデフォルトの挙動です。
シンボリックリンクを辿ってディレクトリを移動した場合、そのリンク先のパスではなく、リンク自体のパスを含んだ形で表示されます。
-Pオプション(物理パス)
-Pオプションは、Physical(物理的)なパスを表示します。
シンボリックリンクをすべて解決し、実際のストレージ上でデータが格納されている実体のディレクトリパスを示します。
システム管理やスクリプト作成において、実際のファイル配置場所を特定する必要がある場合には、この-Pオプションが非常に有効です。
オプションによる挙動の違いを比較
実際にシンボリックリンクを作成して、表示がどのように変わるかを確認してみましょう。
# 実体のディレクトリを作成
mkdir /home/user/real_dir
# シンボリックリンクを作成
ln -s /home/user/real_dir /home/user/link_dir
# リンク側のディレクトリに移動
cd /home/user/link_dir
# オプションなし(または -L)で実行
pwd
# -P オプションで実行
pwd -P
/home/user/link_dir
/home/user/real_dir
| オプション | 意味 | 表示されるパスの性質 |
|---|---|---|
-L | Logical | シンボリックリンクを含む論理的なパス(デフォルト) |
-P | Physical | シンボリックリンクを解決した実際(物理的)なパス |
このように、自分が今「リンクの中にいるのか」「実体の中にいるのか」を判別したい場合には、これらのオプションの使い分けが不可欠です。
環境変数$PWDとの違い
Bashでは、pwdコマンドを実行する以外にも、現在地を保持している環境変数を参照する方法があります。
それが$PWDです。
# 環境変数を表示する
echo $PWD
出力結果は、通常のpwdコマンド(-Lオプション時)と同じになります。
多くのエンジニアは、シェルスクリプト内で現在地のパスを変数に代入したい際、コマンド置換($(pwd))を使うか、この環境変数$PWDを直接利用します。
ただし、環境変数の場合はシェルの設定や状態に依存するため、より確実かつ最新の情報を取得したい場合は、コマンドとしてのpwdを実行するのが安全です。
外部コマンドとビルトインコマンド
実は、Bashにおいてpwdには2種類存在することをご存知でしょうか。
一つはBash自体に組み込まれているシェルビルトインコマンド、もう一つはシステム(通常は/bin/pwdなど)にインストールされている外部コマンドです。
通常、ターミナルでpwdと入力した際に実行されるのはシェルビルトインの方です。
これらはほとんど同じ動作をしますが、外部コマンドとしてのpwdはシェル内部の変数に依存せず、OSのファイルシステムから直接情報を取得しようとします。
# シェルビルトインのpwdを確認
type pwd
# 外部コマンドのパスを確認
which pwd
pwd is a shell builtin
/usr/bin/pwd
日常的な利用で意識する必要はほとんどありませんが、シェルの挙動がおかしくなった場合や、極めて厳密な物理パス取得が求められる環境では、フルパスで/bin/pwdのように呼び出すケースもあります。
シェルスクリプト内でのpwd活用術
シェルスクリプトを作成する際、スクリプトが実行されている場所を特定することは非常に重要です。
例えば、設定ファイルやログファイルを「スクリプトと同じディレクトリ」に保存したい場合があります。
しかし、単にスクリプト内でpwdを実行するだけでは、「スクリプトファイルがある場所」ではなく「スクリプトを実行したユーザーが今いる場所」が返されてしまいます。
スクリプト自身のディレクトリを取得する例
以下のコードは、実行時のカレントディレクトリに左右されず、スクリプトファイル自体が置かれている絶対パスを取得する定番の記述です。
#!/bin/bash
# スクリプトの格納ディレクトリを取得(pwd -P で実体を解決)
SCRIPT_DIR=$(cd $(dirname $0); pwd -P)
echo "スクリプトの場所: $SCRIPT_DIR"
echo "現在の作業ディレクトリ: $(pwd)"
このように、cdコマンドとpwdを組み合わせることで、スクリプトの配置場所を起点とした相対的なパス指定が可能になり、ポータビリティの高いスクリプトを作成できます。
Bashのプロンプトに現在地を表示する方法
毎回pwdコマンドを打つのが手間に感じる場合は、Bashの設定ファイル(.bashrcなど)を編集して、コマンドプロンプトに常に現在地を表示させるのが一般的です。
環境変数PS1をカスタマイズすることで、常にパスを確認できるようになります。
\w:現在のディレクトリをフルパスで表示(ホームディレクトリは~と表示)\W:現在のディレクトリ名のみを表示
# .bashrc などの設定例
export PS1="[\u@\h \w]\$ "
これにより、コマンドを実行する前に視覚的に現在地を確認できるため、pwdコマンドを打つ回数を減らしつつ、ミスを未然に防ぐことができます。
現代の多くのLinuxディストリビューションでは、デフォルトでこの設定がなされています。
まとめ
Bashを利用する上で、pwdコマンドは空気のように当たり前に存在するツールですが、その仕組みやオプションを理解することで、より正確な操作が可能になります。
- pwdは「Print Working Directory」の略で、現在地を絶対パスで表示する。
- デフォルト(-L)は論理的なパス、-Pオプションはシンボリックリンクを解決した物理的なパスを表示する。
- 環境変数
$PWDでも現在地を参照できる。 - シェルスクリプト内では、実行場所の特定に
cdと組み合わせて活用される。
基本的なコマンドだからこそ、オプションの挙動までしっかりと把握しておくことで、トラブルシューティングやスクリプト作成の効率が格段に向上します。
ターミナル操作の第一歩として、ぜひこのpwdコマンドを使いこなしてください。
