絶対パスと相対パスを理解する
パスはファイルやディレクトリの場所を表します。絶対パスはルートから、相対パスは現在の作業ディレクトリからたどります。以下の計算問題は特記しない限りシンボリックリンクがなく、示したディレクトリが存在して移動権限があるLinux上のBashを前提にします。
この単元で学ぶこと
- 絶対パスと相対パスの基点を区別する
- 現在位置と.・..から到達先を求める
- 引用・ホーム展開・サブシェルによる違いを検証する
本文解説
ルートを基点にする /はLinuxのディレクトリ階層の最上位です。/home/learner/project/data.txtのように/から始まる絶対パスは、通常どの作業ディレクトリから参照しても同じ場所を指定します。/rootはrootユーザーのホームとして使われるディレクトリ名であり、階層の最上位/とは別です。
現在位置を基点にする 作業ディレクトリが/home/learner/projectなら、相対パスdata.txtはその下のdata.txtです。同じdata.txtでも/home/learnerへ移動すれば参照先が変わります。pwdで現在位置を確認してから相対パスを読むと、別フォルダのファイルを扱う誤りを防げます。
自分と親を表す記号 .は現在のディレクトリ、..は親のディレクトリです。/home/learner/projectから./data.txtはproject内、../data.txtはlearner内のファイルを指します。cd ..で親へ移動し、cd .では同じ場所にとどまります。ルートの親をたどってもルートです。
移動の成功と失敗 cd DIRは現在のシェルの作業ディレクトリを変更します。成功後にpwdを実行して結果を確認します。存在しないディレクトリへのcdは失敗し、作業ディレクトリは元のままです。cd DIR && pwdなら移動に成功した場合だけpwdを実行できます。
ホーム展開 Bashで引用されていない語頭の~は、通常ホームディレクトリへ展開されます。HOME=/home/learnerなら~/notesは/home/learner/notesを指します。一方"~/notes"の~は引用されているためホーム展開されません。"$HOME/notes"なら変数展開を使い、空白を含む場合も一つの引数として渡せます。
空白を含む名前 ディレクトリ名がproject notesならcd "project notes"と引用して一つの引数にします。引用なしのcd project notesは別々の引数として渡されます。空白は名前に使用できますが、シェルによる引数の分割とファイルシステム上の名前を分けて考える必要があります。
親シェルと子の違い (cd sub; pwd)の括弧内はサブシェルです。中でのcdは親の現在位置を変更しません。対して同じシェルでcd subを実行すればその後もsubが現在位置です。スクリプト内のcdで、呼出し元端末まで移動したと思わないようにします。
実習の前提とリンク 専用の作業場所にmkdir -p lesson-paths/a/b lesson-paths/cで階層を作り、cd lesson-paths/a/b、pwd、cd ../../c、pwdを順に確認します。全手順はその専用場所の中だけで行います。シンボリックリンクがある場合は論理的なパスと実体が異なることがあり、Bashのpwd -Lとpwd -Pやcdの-L/-Pを使い分けます。本単元の手計算はリンクなしなので単純に階層をたどれます。
図解
重要ポイント
- 絶対パスは/から始まり、相対パスは現在位置が基点。
- .は現在、..は親。
- ~の展開はシェルが行い、引用の影響を受ける。
- cd失敗時とサブシェル内の移動では親の現在位置を決めつけない。
間違えやすい点
- /と/rootを同じ場所だと考えない。
- pwdを確認せず相対パスの到達先を決めない。
- "~/..."をホーム展開すると誤解しない。
- リンクがある場合まで単純な文字列の打消しで計算しない。
用語解説
- 絶対パス
- ルート/を基点に指定するパス。
- 相対パス
- 作業ディレクトリ等の基点から指定するパス。
- 作業ディレクトリ
- プロセスが相対パスを解釈するときの現在位置。
- サブシェル
- 親と別の実行環境でシェルの処理を行う仕組み。
- ホーム展開
- 引用されていない語頭の~等をホームのパスへ置き換えるシェルの処理。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。