スクリプトで特定のファイルを探す

スクリプトで特定のファイルを探す

関数が別のスクリプトを検索して見つかった場合は、実行するスクリプトファイルを作成しました。

スクリプト抜粋

#!/bin/bash
...
service_status() {
local my_script=`which my-services-check.sh 2>/dev/null`
[[ -z "$my_script" ]] && { echo -n "functionality not available" ; failure ; echo ; return ; }
source $my_script    
}
...

which my-services-check.sh 2>/dev/null端末でこれを行うと、ファイルへの正しいパスが返されます。

関数を実行するときサービスステータス()(スクリプトが呼び出されたとき)ファイルが見つかりません($my_script空)。

which私は使用しようとしませんでしたが、type最終的にcommand同じ結果を得ました。

パスの問題

それから私は端末とスクリプトから印刷しましたが、間違いなく$PATH違いました!私のスクリプトで実行すると、以下の定義に従って$PATH安全なパスに設定されます/etc/sudoers

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

ターミナルから出発

echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: ...

だから、

  1. スクリプト内で探しているファイルをどのようにして安定して見つけることができますか? (find必要なファイルがパスに存在する必要があるため使用されません)?

  2. スクリプトで実行するときにPATH設定が異なるのはなぜですか?

答え1

対話型シェルはロードされますが、.bashrcスクリプトはロードされません。あなたの$PATH設定.bashrc そして、あなたはそれをエクスポートしません、スクリプトは変更を継承しません$PATH。を呼び出すと、スクリプトはexport PATHこれを確認する必要があります。export -pエクスポートした変数を確認してください($PATHその変数に存在する必要があります)。また、$BASH_ENVどちらがあなたに適用できるかを確認してください$PATH

理想的には、ログイン時にロードおよび設定され、その時点で実行されているすべての項目に表示されるように設定およびエクスポートする必要があり$PATHます。.profile

良い方法は、ファイル名が存在するのではなく、正しいファイルであるか[[ -f "$my_script" ]](インポートするのではなくスクリプトで呼び出す場合)、スイッチを確認することです-x

答え2

実際に含まれる保証はありませんPATH/binしかし、他のすべてが可能または可能です。私のシステムのユーザーにも似たようなものがあります$HOME/bin:/usr/local/bin:/bin:/usr/bin。 rootユーザーも/usr/local/sbin:/sbin:/usr/sbinいます。

ファイルが複数の場所のいずれかに存在できる場合は、その場所からファイルを検索できます。この検索から完全な依存関係を削除するか、PATHPATHを拡張してスクリプトを見つけることができる最小の場所のセットを含めるだけです。

local OPATH="$PATH"
PATH="$PATH:/extra/place:/another/extra/place"
local my_script=$( which my-services-check.sh 2>/dev/null )
PATH="$OPATH" # Restore the original PATH (optional)

if test -z "$my_script"; then ...; fi
. "$my_script"

または、PATHスクリプトの上部に必要な値を設定するだけです。初期スクリプトが実行されると、それを設定できない理由はありませんPATH。私は、環境が合理的であることを知るために、多くのスクリプトでこれを行う傾向があります。

関連情報