Bash
為什麼不使用 Bash 工作的 Makefiles 中的字元串?
我剛剛解決了我的 Makefile 的一個問題。
<<<
使用錯誤消息遍歷每一個/bin/sh: 1: Syntax error: redirection unexpected
我想知道為什麼。(我使用 Bash 作為
SHELL
)在我目前的項目中,我嘗試了很多類似的食譜:
target: read FOO <<< "XXX"; \ read BAR <<< "YYY"; \ read BAZ <<< "ZZZ"; \ someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
<<<
如開頭所述,嘗試此操作將導致每個錯誤。我的解決方法是target.dep: echo "XXX YYY ZZZ" >$@ target: %: %.dep read FOO BAR BAZ < $<;\ someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
這意味著我將我的東西放入臨時文件中,然後使用
<
. 當我將 make 輸出複制粘貼到正常的 bash 提示符時,每個命令都按預期工作,即使使用<<<
. 我相當肯定我的問題是,使用<<<
運算符,即這裡的字元串,會破壞一些東西。為什麼會這樣,有沒有辦法讓這裡的字元串在 Makefile 中工作?PS:是的,有時我覺得 autotools 會是比 make 更好的選擇。
/bin/sh: 1: Syntax error: redirection unexpected
意味著您沒有使用 bash 作為您的外殼,儘管您的期望相反。bash as
sh
辨識這裡的字元串很好(所以你Makefile
可以在 Fedora 上工作),但例如 dash assh
沒有。除非另有說明,否則 Make/bin/sh
用作其外殼;它會忽略您的預設使用者外殼。環境
SHELL=/bin/bash
在你
Makefile
應該為你解決問題;至少,在顯示與您相同症狀的系統上,它對我有用。PS:是的,有時我覺得 autotools 會是比 make 更好的選擇。
Autotools 和 Make 沒有解決同樣的問題。它們是互補的,使用 Autotools 仍然意味著使用 Make …