このようなレシピに注意してください
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
それは2つのことを間違っています。レシピの最初の行は、2番目の行とは別のシェルインスタンスで実行されます。その間、変数は失われます。2つ目の誤りは、$
エスケープされていないことです。
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
両方の問題が修正され、変数は使用可能です。バックスラッシュは両方の行を組み合わせて1つのシェルで実行するため、変数の設定と変数の後書きの読み取りが機能します。
元の投稿では、シェルコマンドの結果をMAKE変数に取得する方法を説明していることを理解しています。この回答は、シェルコマンドに結果を取得する方法を示しています。しかし、他の読者にもメリットがあるかもしれません。
最後の1つの改善点は、消費者が「環境変数」が設定されることを期待している場合は、それをエクスポートする必要があることです。
my_shell_script
echo $MY_ID
メイクファイルでこれが必要になります
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
それが誰かを助けることを願っています。一般に、レシピ以外で実際の作業を行わないようにする必要があります。誰かが '--dry-run'オプションを指定してmakefileを使用すると、それが何をするのかを確認するだけで、望ましくない副作用が発生しないためです。すべての$(shell)
呼び出しはコンパイル時に評価され、実際の作業の一部が誤って実行される可能性があります。可能な場合は、IDの生成などの実際の作業をレシピの内部に残した方がよいでしょう。