2017-11-10 3 views
0

makeターゲットを書き込もうとしていますが、envを設定しています。シェルコマンドで得られた変数。Makefile:コマンドによって出力される環境変数を設定します。

gcloud beta emulators datastore env-init端末の出力では、いくつかのexports文が好きです(設定されていませんが、ちょうどエコー/プリント)。

export DATASTORE_EMULATOR_HOST=localhost:8432 
export DATASTORE_PROJECT_ID=my-project-id 

通常、変数を設定するには、これらの行をコピーして端末に貼り付ける必要があります。

これらの印刷されたエクスポート文を実行して、シェル上で設定できるようにすることは可能ですか?私は好きだったが、うまくいった。

target: 
    @export JAVA_HOME=$(JAVA_HOME); \ 
    $(shell gcloud beta emulators datastore env-init); \ 
    go run src/main.go 

私が好きならば、それはスクリプトの出力を出力し、JAVA_HOMEと同様に

target: 
    export JAVA_HOME=$(JAVA_HOME); \ 
    gcloud beta emulators datastore env-init \ 
    go run src/main.go 

、どのようにもI(エクスポートコマンドの4行をしている) gcloud beta emulators datastore env-initコマンドのソース出力することができますので、彼らは、環境内に設定されています。

はので、私は、実際には、

target: 
     export JAVA_HOME=$(JAVA_HOME); \ 
     export DATASTORE_EMULATOR_HOST=localhost:8432 \ 
     export DATASTORE_PROJECT_ID=my-project-id \ 
     go run src/main.go 

おかげのような何かをしたいです。 bsr

答えて

1

出力はmakeで出力され、サブプロセスの環境の内容には実際に影響しません。

変数の割り当てが効果を持たないように見えるのは、それぞれの行が新しい環境を持つ別々のサブシェルで実行されるからです。あなたはこのように一緒コマンドに参加する必要があります。

target: 
    export JAVA_HOME=$(JAVA_HOME); \ 
    eval "$$(gcloud beta emulators datastore env-init)"; \ 
    go run src/main.go 

gcloudコマンドの出力を現在のシェルではなく、サブシェルで評価されるようにevalが必要です。また、レシピの2行目の最後のセミコロンにも注意してください。

+0

だから、私は好きだよ。 '' 'target: @export JAVA_HOME = $(JAVA_HOME); \ gcloudベータエミュレータdatastore env-init \ src/main.go'''を実行しますが、envを実行してください。 'gcloud'コマンドで表示される変数は設定されません。 – bsr

+0

申し訳ありませんが、私は間違った言葉かもしれません。明確にするために質問を少し編集しました。トレースするのではなく、コマンド(gcloud beta ...)で変数を設定(エクスポート)します。したがって、コマンドの出力は2 export statemensです(これはコンソールに出力されますが、設定されません)。これらの変数を設定し、次の行(同じシェル)でコマンドを開始したいと思います。私はmakefileレベルで設定しても構いませんが、env変数はターゲットを実行する直前にのみ使用できます。ターゲットを実行する直前にコマンドを評価することは可能ですか?助けてくれてありがとう。 – bsr

+0

ありがとう。私は最初にあなたの編集を見ることに失敗しました:-)それは素晴らしい作品です。もう一度あなたの時間に感謝します。 – bsr

関連する問題