Makefileで.env
を使用する、つまりそのファイルをロードしてmake
のサブシェルのすべての変数をエクスポートする最良の方法は何ですか?
提案されたソリューションがmake
のみで機能する場合は、すばらしいでしょう。サードパーティのツールを使用していません。また、.env
ファイルは、次のような複数行の変数をサポートしています。
FOO="this\nis\na\nmultiline\nvar"
これが このソリューション がおそらく適切でない理由です。
Makeは、ファイルの内容を変数に読み込む方法を提供していません。したがって、外部ツールを使用せずに結果を達成することは不可能だと思います。しかし、私が間違っている場合は、新しいトリックを教えていただければ幸いです。
したがって、技術的に正しいシェルファイルである.env
の2つのファイルがあると仮定します。
FOO=bar
BAR="notfoo" # comment
#comment
MULTILINE="This\nis\nSparta!"
# comment
およびscript.sh
:
#!/bin/bash
echo FOO=${FOO}
echo BAR=${BAR}
echo -e ${MULTILINE}
1つの解決策は、.env
ファイルを含めて、変数がエクスポートされていることを確認することです。
include .env
$(eval export $(Shell sed -ne 's/ *#.*$//; /./ s/=.*$$// p' .env))
all:
./script.sh
Shellとmakeでは引用符の扱いが異なるため、出力には引用符が表示されます。
Makeで変数を再処理することでそれを回避できます。
include .env
VARS:=$(Shell sed -ne 's/ *\#.*$$//; /./ s/=.*$$// p' .env )
$(foreach v,$(VARS),$(eval $(Shell echo export $(v)="$($(v))")))
all:
./script.sh
しかしその後、複数行の変数はワンライナーになります。
最後に、bashで処理する一時ファイルを生成し、コマンドを実行する前にそのファイルを読み込むことができます。
Shell=bash
all: .env-export
. .env-export && ./script.sh
.env-export: .env
sed -ne '/^export / {p;d}; /.*=/ s/^/export / p' .env > .env-export
ああ、この場合、複数行変数で新しい行がめちゃくちゃになりました。さらに引用する必要があります。
最後に、上記のexport
コマンドを使用してsed
を.envに追加し、次のようにします。
Shell=bash
%: .env-export
. .env-export && make -f secondary "$@"