Linuxでのコマンドの検索パスを正確に確認する方法に対する実務上の答えは「実際に何が実行されるかはtype -aとcommand -Vで確認し、PATH文字列だけで判断しません。変更後はhash cacheとsession差も検証します。」です。ここではBashではalias、function、builtin、hashed command、PATH上のexecutableの順で解決される前提を明示し、初回確認、sample実行、本番判定、元へ戻す条件をそれぞれ独立させます。 確認ポイント:type、command、hash cacheを使い分け、PATHの空要素がcurrent directoryを意味し得る点を警戒します。
alias・function・builtin・fileを検索対象に含める
本番と同じ構文をいきなり広い範囲へ使わず、一件のsampleで入力と出力を観察します。権限不足をadministrator常用で隠さず、必要権限を個別に確認します。
- 現在shellとPATHを記録する
- alias、function、builtinの同名を確認する
- 全候補pathとfile ownerを確認する
- non-interactive環境のPATHも別に確認する
件数上限を越えた場合はwildcard、再帰範囲、filterを見直し、対象一覧を作り直します。
PATHとhash cacheを別々に点検する
- whichの一行だけで実体を断定する
- aliasやfunctionを見落とす
- PATHの空要素を無視する
- sudoやcronも同じPATHだと思う
- PATH変更後のhashed commandを確認しない
表示差がlocaleやformat由来か、data自体の差かを分けて確認します。
type・command -V・command -vを使い分ける
すべての候補を表示
type -a -- python
alias、function、builtin、PATH上の候補を現在shellの解決規則で表示します。
実行されるcommandを説明
command -V -- python
一つのpathだけでなくcommand種別を含めて確認します。
script向けの存在確認
if command -v -- git >/dev/null 2>&1; then command -v -- git; else printf '%s\n' 'git not found' >&2; fi
whichの表示だけへ依存せずshell builtinを使います。
PATHを一要素ずつ表示
printf '%s' "$PATH" | tr ':' '\n'
空要素がcurrent directoryを意味し得るため、そのままreviewします。
hash cacheを表示
hash -l
PATH変更後の再検索が必要なら対象shellでhash -rを検討し、影響を説明します。
最初に実行される実体を確定する
PATHはcolon区切りのdirectory listですが、Bashはその前にalias、reserved word、function、builtin等を解決します。command -vはshell自身の判断、whichは外部programで実装差があります。sudo、cron、systemd、SSH non-loginはinteractive shellと異なるPATHになり得ます。
0とnull、空文字と未設定、0件とerrorを別の状態として扱います。
PATH変更前の値を保存する
PATH先頭へwritable directoryやdotを置くとcommand hijackの危険が増えます。system-wide profileを即変更せず、対象sessionの読み取り結果とowner、mode、executable hashを確認します。自動化では重要commandをabsolute pathへ固定する選択も検討します。
段階反映では各単位の確認を終えてから次へ進み、最初の不一致で停止します。
shell起動種別とPATHを記録する
interactive/login/non-interactive shell、一般user、service実行環境でtype -aとPATHを比較します。同名test executableを安全な一時directoryで確認し、予想した順序とhash cacheの変化を記録します。
一時fileやsessionを片付ける前に、原本と設定が意図した状態か再取得します。
空PATH要素と信頼できないdirectoryで停止する
実例のうち「すべての候補を表示」はbaselineを得る用途、「実行されるcommandを説明」は対象をさらに具体化する用途として使い分けます。両方の出力を同じ形式へ無理に整形せず、元の型と件数を保持したまま比較します。期待値は画面の見た目ではなく、対象ID、path、時刻など再照合できる列で定義します。
command -v の結果を記録するときは、同時に PATH と type -a の結果も残します。エイリアス、関数、シェルのcommand hash、同名実行ファイルの追加によって、同じコマンド名でも解決先が変わるためです。インストール直後に古い解決先が残る場合は、新しいシェルで確認するか、影響を理解したうえで hash -r を使います。
Bashのcommand hashは hash で一覧、hash -t 名前 で記録先を確認できます。実行ファイルの追加・置換後に解決先を再評価したい場合は、新しいシェルを開くか hash -r でcacheを消去します。これはBashの機能で、すべてのshellに同じoptionがあるわけではありません。手順書には使用shellとPATHを併記します。
再試行の前に、which の一行だけで実体を断定していないか、aliasやfunctionを見落としていないか確認します。type -a と command -V で候補の種類を分け、PATHの空要素がcurrent directoryを表すshell設定では、そのsecurity影響も明記します。
PATHを検証するためにsystem-wide設定を書き換えず、必要なら一つのprocessだけへ一時値を渡します。current directoryや一般ユーザーが書き込めるdirectoryが先頭にある場合は、同名programの取り違えに注意してください。sudo、cron、serviceは対話shellと別のPATHになるため、同じ結果を仮定しません。
再現記録にはshellとversion、PATHの完全な値、PWD、type -a、command -v、Bashのhash一覧を含めます。候補pathの所有者とmodeも必要に応じて確認します。hash -r を使った場合はcacheだけの変更であり、PATH設定そのものは変わらないと区別します。
完了条件は、command名がalias・function・builtin・fileのどれとして解決されるか説明でき、実行されるfileが期待したpathと一致することです。対話shellと自動実行環境の差を分離し、書き込み可能directoryの優先による乗っ取りriskがないか確認します。
Linux commandの検索path確認の開始記録には「現在shellとPATHを記録する」を最初に置きます。続けて「alias、function、builtinの同名を確認する」を確認すると、対象違いと環境違いを作業前に分けられます。
対象範囲を確定する段階では「全候補pathとfile ownerを確認する」が判断材料になります。また「non-interactive環境のPATHも別に確認する」を満たさない場合は、技術的に実行できても運用上の準備不足です。
PATHには空の要素を入れないでください。先頭・末尾のcolonや連続colonは現在directoryを検索対象にする実装があり、意図しない同名commandの実行につながります。変更後はcommand -vで解決先を確認し、Bashが以前の場所をcacheしている場合はhash -rを実行してから再確認します。sudo、cron、systemdは対話shellと別のPATHを持ち得るため、実際の起動経路ごとに検証します。

コメント