関数が別のスクリプトを検索して見つかった場合は、実行するスクリプトファイルを作成しました。
スクリプト抜粋
#!/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
。