3

いくつかの環境変数の割り当て (例: ) を含む bash ファイル (bash_file と呼びましょう) と、TOOLS_DIR="/opt/tools"別のファイル (例: source /opt/other_file) をソースし、other_file からソースされた環境変数から環境変数を構築する bash コード (例: NEW_ENV_VAR=$FILEPATH/$FILENAMEFILEPATH FILENAME は other_file に割り当てられます)。

これらの環境変数の可視性を必要とする Java アプリケーションがありSystem.getenv()ますが、Java のシェルで bash ファイルがまだソース化されていないため、標準を使用してもこれらの環境変数が取得されません。Java の を使用すると、bash のコマンドが使用されRuntime.exec("source bash_file")ていても、環境変数は Java の子シェルにのみ存在します。export

純粋な bash を使用している場合は、単に mysource bash_fileを実行するだけで、bash_file で割り当てられたすべての環境変数にアクセスできますが、Java ではそれほど単純ではありません。

私はすでにいくつかのオプションを考えましたが、どれも特にエレガントに見えません:

  1. source bash_fileコマンドと同じプロセスで、現在envのプロファイルを .bashprofile に追加して、System.getenv() などの将来のすべてのランタイム exec 呼び出しで使用できるようにします。

    問題:実行時に getenv が bashprofile に追加された環境変数を取得するかどうかは 100% 確信が持てません。また、これらの変数をすべてグローバルにエクスポートするのはまったく適切ではありません。

  2. 再び と同じプロセスでsource_bash_file、currentenvをテキスト ファイルに保存し、Java で手動で解析します。

    問題:これで作業は完了しますが、 によって返される Map ほど素晴らしくエレガントではありませんSystem.getenv()。パーサーを Java で作成するのもかなり難しいようです。

  3. Java の bash 環境がインスタンス化されている場所 (おそらく java.System.lang) を把握し、Java の環境を初期化するsource bash_file に実行するために変更して、変数が Java アプリによって継承されるようにします。

    問題:これは私のすべてのオプションの中で最も厄介なように思えます。Java のシェル環境の初期化をどこから探し始めればよいかわかりません。

Java からbash のようなsource操作を実行する方法はありますか、またはその機能を取得するための最も簡単な実装は何ですか? 私はまた、可能な行動方針の評価において多くの不確実性を表明しており、誰かがそれらの不確実性について私に記入していただければ幸いです.

ありがとう!

4

1 に答える 1

2

いいえ、Java 内で bash コードを実行するための一般的な方法はありません。しかし、Java プログラムがシェル スクリプトを介して呼び出されることは非常に一般的です。あなたのものはまだそのように機能していませんか?存在する場合は、プログラムを実行する前に他の bash ファイルをソースする最も簡単な場所です。

何らかの理由でそれができない場合は、#2 が最適なソリューションです。#1 と #3 は良くありません。このプログラムを実行できるようにするためだけに、システム全体またはアカウント全体の設定を変更したくはありません。特に、他の人に使用させる予定がある場合はなおさらです。

2 番目のオプションの解析は、それほど複雑である必要はありません。ビルトインなどを使用して環境変数を出力するsetだけで、Java パーサーで一度に 1 行ずつ読み取り、=各行の最初の記号で分割するだけです。変数に改行が含まれている場合、bash はドル引用符で囲まれた文字列内でそれをエスケープする必要があります。これにより、解析が混乱する可能性がありますが、埋め込まれた改行について心配する必要はないので、結果をガベージとして扱います。''また、 orに含まれる値の引用符を外したい""場合や、その 2 番目のケースでバックスラッシュ エスケープを処理したい場合もありますが、このようなほとんどの場合、バックスラッシュの解析は必要ありません。

于 2012-07-12T18:13:01.723 に答える