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で機能させる方法はありますか?
追伸:はい、時々私はautotoolsがmakeよりも良い選択だと感じます。
/bin/sh: 1: Syntax error: redirection unexpected
反対の期待にもかかわらず、シェルとしてbashを使用していることを意味しますnot。 bash as sh
はここで文字列を正しく認識します(したがって、Makefile
はFedoraで機能します)が、たとえばdash as sh
は認識しません。特に明記されていない限り、Makeはシェルとして/bin/sh
を使用します。デフォルトのユーザーシェルは無視されます。
設定
Shell=/bin/bash
Makefile
で問題を修正する必要があります。少なくとも、あなたと同じ症状を示すシステムではそうです。
追伸:はい、時々私はautotoolsがmakeよりも良い選択だと感じます。
AutotoolsとMakeは同じ問題に対処していません。それらは補完的であり、Autotoolsを使用することはMakeを使用することを意味します...
エラーメッセージでわかるように、make
が呼び出すシェルはbash
ではなく、/bin/sh
です。 sh
は一般的にヒア文字列を理解しません。
make
変数Shell
を/bin/bash
(またはシステム上のそのシェルのパスが何であれ)に設定すると、bash
の代わりにsh
が使用されます。
これに関する関連するGNU make
ドキュメント https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html も参照してください。 ==