David C. Rankin's helpful answerなぜあなたのコードうまくいかなかった。
注:あなたがで動作するスクリプトを修正することはできない場合は
次ソリューションは、(あなたがソーシングとアドホック環境変数について知りたい場合は解決策にも興味があります)を使用する必要があります。
それ以外の場合は、下部に記載されている解決策を参照してください。
あなたの問題を解決するには、次のように試すことができます。
x=$(trap 'printf %s "$x"' EXIT; . script1.sh >/dev/null) sh script2.sh
ただし、:
script1.sh
がします - 必然的に - あなたの現在のシェルによって実行されますこれはsh
である場合とそうでない場合があります。
script1.sh
の出力は抑制されます。printf %s "$x"
がコマンド置換($(...)
)内のサブシェルによって生成される唯一のstdout出力であることが保証されなければならないからです。
- このアプローチは単一の変数に制限されています(ただし、呼び出し元のスクリプトが個別の値に解析しなければならない複数の変数の値を出力するように拡張することもできます)。
. script1.sh
源サブシェルは、独自の環境で直接script1.sh
を実行することを意味し、したがって、それがなかった場合でも、それは$x
を見ることを意味している(それを実行した後、スクリプトの変数を見てサブシェル内のスクリプト、 をエクスポート)。
trap 'printf %s "$x"' EXIT
は終了トラップを設定します。すなわち、サブシェルが終了するときに実行されるコード、この場合はprintf %s "$x"
であり、単に関心のある変数の値を出力する。
ステートメントのためにscript1.sh
が終了しても、$x
の値が確実に出力されるようにするには、この方法が必要です。 script1.sh
はのサブシェルであるであるため、exit
はサブシェル全体を終了します。
x=$(...)
は、その値を取り込み、そして、はsh script2.sh
を指令するを前に付加されることによって、効果的にscript2.sh
が、その後見ている結果$x
環境変数になります。
これは、一般的に調達するように設計されていないソースのスクリプトに問題です:
- すべてスクリプトによって変更または作成された変数と行っシェル環境に変更スクリプトが呼び出すシェルに影響します。
- このようなスクリプトで
exit
が実行されると、呼び出し元のシェルも終了します。
何らかの理由でスクリプトを変更できない場合、いくつかの制限がありますが、これらの問題を回避するため、上記の解決方法が最適です。
より強固な、一般的なソリューション(必要なスクリプトの変更):
関心自体の環境変数(複数可)を設定するスクリプトを持つ他のスクリプトが適切なソリューションである呼び出しますDavid's answerに示すように、
スクリプトがピアとして実行する必要がある場合は、値がファイルを経由して渡される必要があります。興味のある変数を設定するスクリプト(s)は(一時的な)ファイルにその値を書き込み、他のを持っています
script1.sh
:
#!/bin/sh
export x=19
# Write to temp. file named for the *parent* process ID.
# Since both script calls will have the same parent process, this
# allows you to avoid a static filename subject to name collisions.
printf %s "$x" > /tmp/x.$PPID
script2.sh
:
#!/bin/sh
# Read the value of $x from the temp. file, then delete the file.
x=$(cat /tmp/x.$PPID) && rm /tmp/x.$PPID
echo "x=${x}"
スクリプトは、そのファイルを読みます
スタックオーバーフロー['bash'タグwiki](http://stackoverflow.com/tags/bash/info)のよくある質問の中で、http://stackoverflow.com/questions/17852111/unable-スクリプトファイルをエクスポートする変数とスクリプトファイルをエクスポートするhttp://stackoverflow.com/questions/4277665/how-do-i-compare-two-string-variables-in-an-if-statement-in- bash - これらはどちらもよくある質問です。 – tripleee
ありがとう@tripleee –