関数が別のスクリプトを検索して見つかった場合は、実行するスクリプトファイルを作成しました。
スクリプト抜粋
#!/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: ...
だから、
スクリプト内で探しているファイルをどのようにして安定して見つけることができますか? (
find
必要なファイルがパスに存在する必要があるため使用されません)?スクリプトで実行するときに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
います。
ファイルが複数の場所のいずれかに存在できる場合は、その場所からファイルを検索できます。この検索から完全な依存関係を削除するか、PATH
PATHを拡張してスクリプトを見つけることができる最小の場所のセットを含めるだけです。
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
。私は、環境が合理的であることを知るために、多くのスクリプトでこれを行う傾向があります。