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

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

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

スクリプト抜粋

#!/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

おすすめ記事