Bash

為什麼不使用 Bash 工作的 Makefiles 中的字元串?

  • May 22, 2018

我剛剛解決了我的 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 assh辨識這裡的字元串很好(所以你Makefile可以在 Fedora 上工作),但例如 dash assh沒有。除非另有說明,否則 Make/bin/sh用作其外殼;它會忽略您的預設使用者外殼。

環境

SHELL=/bin/bash

在你Makefile應該為你解決問題;至少,在顯示與您相同症狀的系統上,它對我有用。

PS:是的,有時我覺得 autotools 會是比 make 更好的選擇。

Autotools 和 Make 沒有解決同樣的問題。它們是互補的,使用 Autotools 仍然意味著使用 Make …

引用自:https://unix.stackexchange.com/questions/445325