一部のスクリプトがエクスポートしたシステム変数を使用するのはなぜですか? [コピー]

一部のスクリプトがエクスポートしたシステム変数を使用するのはなぜですか? [コピー]

私はUbuntuに関する多くのオンラインチュートリアルを見てきました。

たとえば、

export JAVA_HOME=/usr/local/java/jdk1.8.0_05
export CATALINA_HOME=/ubuntuland/utils/apache-tomcat-8.0.8

バラよりこのチュートリアル

私は論理を理解しようとしています。なぜなら、彼らが自分のものを定義するのではなく、システム変数を使うというのは私にとっては理解できるからです。

編集する

作成時: echo $JAVA_HOMEシェルでは、サーバーのいつでも(再起動後)、すべてのシェルで正しいコンテンツを表示できます。

答え1

時には、何かを実行するためにバージョンを使用する必要があります。あなたの場合、これはTomcatサーバーを駆動するJavaバージョンになります。グローバルJavaバージョンは時間の経過とともに変更される可能性があり、バグや非互換性によってTomcatサーバーがクラッシュする可能性があります。したがって、独自のTomcatを定義することで、以前にテストさJAVA_HOMEれた信頼できるJavaバージョンでTomcatが起動していることを確認できます。もう1つのポイントは、複数のインスタンスが実行中であり、異なるインスタンスに対して異なるインスタンスを指定する必要があることですCATALINA_HOME

私の考えに最適なアプローチは、システム全体の構成によって時間の経過とともに変化したり存在しない可能性がある変数に依存するのではなく、変数を明示的に定義することです。また、問題を解決し、どのパスとバイナリが使用されているかを確認するのも簡単です。

答え2

マニュアルbashにはこのような言葉がありますexport

export [-fn] [name[=word]] ...
export -p
        The  supplied names are marked for automatic export to the envi‐
        ronment of subsequently executed commands. [...]

これは、変数をエクスポートするときに、変数をエクスポートしたシェルのすべての子プロセスで使用できることを意味します。表示するには:

$ foo="bar"              
$ bash -c 'echo "$foo"'  ## the variable isn't available to the child

$ export foo="bar"
$ bash -c 'echo "$foo"' ## the child also gets the variable
bar

したがって、export現在実行中のシェルだけでなく、すべてのプロセスで変数を使用できるようにするには、この変数を使用します。

関連情報