実行可能なhealthcheckが現在のディレクトリにある。
現在のディレクトリはPATHに含まれていない。
現在のディレクトリはルートでもホームでもない。healthcheckのエイリアス・シェル関数・キャッシュ済みコマンドはなく、この通常の実行可能ファイルを明示して実行する。
適切な実行方法はどれか。
コマンド名にスラッシュが含まれると、BashはPATH検索ではなく指定パスを実行する。./は現在のディレクトリを表す。
詳細解説
healthcheckPATHに現在のディレクトリがないため名前だけでは検索されない。
名前だけでは、現在位置のファイルを指定したことにならない。PATH上に同名の実行ファイルがあれば別の処理が起動し、なければ通常は見つからない。
/healthcheckルートディレクトリ直下の別パスを指定する。
先頭の/はルートからの絶対パスである。現在位置はルートではないという前提なので、ここにある対象を指定しない。
~/healthcheckホームディレクトリ直下を指定し、現在のディレクトリとは限らない。
先頭の~はホームの場所を使う。現在位置はホームではないという前提なので、./healthcheckと同じ指定にはならない。
./healthcheck./で現在のディレクトリにあるファイルを明示する。
./で現在位置を明示し、スラッシュを含む指定としてPATH探索を使わず対象を実行する。実行権限や利用できるインタープリターなど、実行の前提は別に必要である。
実際に確かめる
一時的な検証環境で実行できる例です。
LAB_DIR=$(mktemp -d) || exit 1
(
cd "$LAB_DIR" || exit 1
mkdir search || exit 1
printf '#!/bin/sh\nprintf "CURRENT\\n"\n' > healthcheck
printf '#!/bin/sh\nprintf "SEARCH\\n"\n' > search/healthcheck
chmod u+x healthcheck search/healthcheck || exit 1
(
PATH="$LAB_DIR/search"
hash -r
healthcheck
./healthcheck
)
rm -- healthcheck search/healthcheck
rmdir -- search
)
rmdir -- "$LAB_DIR"参考にした公式資料
期待される結果
SEARCH
CURRENT理解のポイント
- PATH検索
- 相対パス./
- 実行権限
確認時の注意
- 確認環境: Bash 5.2 / GNU coreutils / /bin/sh。新規Bashの一時ディレクトリ内で実行。比較用PATHとhashの変更は内側の子シェルだけに限定し、HOMEは変更しない。
- 一時ディレクトリの作成とcdに失敗した場合は、その先のファイル作成を行わない。実行例は作成したディレクトリ内の固定した名前だけを扱う。
- 比較用PATHには別の同名実行ファイルを意図的に置く。これは名前だけでは現在位置の対象を選べないことを示す補助例であり、HOMEや既存PATHの値を書き換えない。
基礎のおさらい
同名ファイルを分けて観察する
検証ではPATH用ディレクトリと現在位置へ同名ファイルを置く。名前だけならSEARCH、./指定ならCURRENTとなり、たまたま同じ出力が出たことと指定先が正しいことを区別できる。
ホームと現在位置は別の概念
現在位置がホームなら~/healthcheckも同じ指定になる場合がある。設問では現在位置をホーム・ルートから分け、正答が前提によって揺れないようにする。
実行例の影響範囲を閉じる
PATHとhashは内側の子シェルに限定し、外側では通常のrm/rmdirを使える状態を保つ。作ったファイルと空ディレクトリだけを片付け、再帰削除は使わない。