Make
在 makefile 目標中使用 env 變數
我試圖弄清楚如何在 makefile 中使用環境變數。我有(某種)特定案例,我需要執行以下步驟:
- 執行命令1
- 將輸出形式 command2 分配給 env 變數
- 執行 command3 讀取在步驟 2 中分配的環境變數
這是實現上述步驟的生成文件。但是,當我執行它時,它會列印一個空變數。我究竟做錯了什麼?當我在我的 bash 中執行這些命令時,它工作得很好)🤔
test: @bash -c "\ echo 'need to run some program before assigning env variable';\ export TEST="$(date)";\ echo 'printing env';\ echo ${TEST};\ "
make 使用美元符號,因此如果您希望將它們傳遞給 shell,則需要對它們進行轉義。你可以通過將它們加倍來做到這一點。
test: @bash -c "\ echo 'need to run some program before assigning env variable';\ echo 'The make CC variable is set to :${CC}:';\ export TEST=\"\$$(date)\";\ echo 'printing env';\ echo \$${TEST};\ " testwithout: @echo 'need to run some program before assigning env variable';\ echo 'The make CC variable is set to :${CC}:';\ export TEST="$$(date)";\ echo 'printing env';\ echo $${TEST};
其他問題是由兩次解釋字元串引起的。
make
獲取接收方,轉換序列反斜杠換行符,並將結果提供給 shell 執行。當您使用雙引號時,bash -c " .... "
這會導致 shell 擴展美元符號,因此您最終會得到 `bash -c “echo ’need …’ ;export TEST=Mon Sep…; echo ;"。添加一些反斜杠字元可以保護美元符號和內部雙引號。可能不需要使用
bash -c
. 如testwithout target所示。您仍然需要將命令構造為一行。Gnu make.ONESHELL
可以使用單個 shell 來執行配方,而不是每個邏輯行一個 shell,這樣可以避免扭曲。