Bash スクリプトは変数をパスの一部として認識しません。

Bash スクリプトは変数をパスの一部として認識しません。

このif文は次のようになります。

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then
    OSSIE_AC_INCLUDE=${OSSIEHOME}/share/aclocal/ossie
else
    echo "Error: Cannot find the OSSIE aclocal files. This is not expected!"

常にデフォルトのエラーメッセージです。コマンドラインから実行するOSSIEHOMEと値があることがわかります。echo $OSSIEHOME

/usr/local/redhawk/core

そのパスをスクリプトにハードコードすると正常に動作します。問題は、他の大きなスクリプトがあるため、正しいパスをハードコードできないことです。私は何が間違っていましたか?

編集: od -c <<<"$OSSIEHOME"これをください:

0000000 / u s r / l o c a l / r e d h a
0000020 w k / c o r e \n
0000030

ls -l /usr/local/redhawk/core/share/aclocal/私にこれを与えた:

drwxr-xr-x 2 root root 4096 Jul 19 10:02 ossie

スクリプトを実行すると、次のようにbash -xなります。

+ rm -f config.cache
+ '[' -e /usr/local/share/aclocal/libtool.m4 ']'
+ '[' -e /usr/share/aclocal/libtool.m4 ']'
+ /bin/cp /usr/share/aclocal/libtool.m4 acinclude.m4
+ libtoolize --force --automake
+ '[' -n ']'
+ '[' -d /share/aclocal/ossie ']'
+ echo 'Error: Cannot find the OSSIE aclocal files. This is not expected!'
Error: Cannot find the OSSIE aclocal files. This is not expected!
+ '[' -n ']'
+ aclocal -I
aclocal: error: option '-I' requires an argument
aclocal: Try '/bin/aclocal --help' for more information.
+ autoconf
+ automake --foreign --add-missing

OSSIEHOME万が一に備えてグローバル化するためにエクスポートしようとしましたが、うまくいきませんでした。それからスクリプトを実行しよ. script.shうとしていますが、source script.sh問題はsudoを使用してスクリプトを実行する必要があるということです。それ以外の場合は、操作に必要な権限がありません。これをしましたが、エラーが発生した場合

sudo: source: command not found

答え1

その問題は質問コメントで診断されました。私の答えでは、何が起こったのか、そしてどのように解決するのかを説明します。

パスワード

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then

引用符なしで変数拡張を使用しているので危険です。"${OSSIEHOME}"または"$OSSIEHOME"変数値に展開しますが、${OSSIEHOME}外側の引用符を単語に分割します。特に、演算子の左側にあるコマンドは、変数が空であるか設定されていない場合はtrue&&に展開されます。実行後に生成されたトレースでこれを確認[ -n ]できます。バラよりbash -x[ -n ]スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細については。これから、変数とコマンドの置換には常に二重引用符を入れる必要があることに注意してください。

if [ -n "${OSSIEHOME}" ] && [ -d "${OSSIEHOME}/share/aclocal/ossie" ]; then

これにより、破損したエラー報告が修正されます。ただし、スクリプトの実行時に変数が設定されていることを確認する必要があります。echo $OSSIEHOME現在、シェルに何かが印刷されていることを確認するだけでは不十分です。変数が環境にあることを確認する必要があります。 run を実行すると、OSSIEHOME=/usr/local/redhawk/coreシェル変数のみが設定されます。環境変数を設定するには、実行export OSSIEHOME=/usr/local/redhawk/core(またはOSSIEHOME=/usr/local/redhawk/coreその後)する必要がありますexport OSSIEHOME

スクリプトを呼び出してこれを行うと付け加えましたsudo。一般的な構成では、sudoは環境からほとんどの変数を削除します。 (これはユーザーが特定のコマンドのみを実行できるようにする場合はセキュリティにとって非常に重要ですが、sudoを使用して任意のコマンドを実行できるようにする場合は面倒で強力なセキュリティ上の利点はありません。)したがって、sudoに実行するように明示的に指示する必要があります。します。この変数は、次の場合に設定されます。スクリプトを実行している場合。

sudo OSSIEHOME=/usr/local/redhawk/core /path/to/your/script

変数がシェル環境にすでに設定されていて値を繰り返さないようにするには、次のようにします。

sudo OSSIEHOME="$OSSIEHOME" /path/to/your/script

または、実行が許可または許可されていない可能性がありますsudo -E /path/to/your/script。この-Eオプションは、sudoにほとんどの環境変数を保存するように指示します。

sudo を実行しsourceたり.使用しても実行可能なコマンドではなくシェル組み込みコマンドなので何の効果もありません。彼らの使命は次のとおりです。スクリプトの実行すでに実行中の同じシェルつまり、別のプログラムを実行するのではなく、ファイルからコマンドを読み取るシェルのコマンドです。これはsudoでは意味がありません。スクリプトが同じシェルプロセスで実行されると、同じ権限で実行されます。

1上級ユーザーの場合は、「省略する理由がわからない場合」を追加します。

関連情報