web-dev-qa-db-ja.com

Bashを使用したMakefileの文字列が機能しないのはなぜですか?

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よりも良い選択だと感じます。

2
Bananguin
/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を使用することを意味します...

5
Stephen Kitt

エラーメッセージでわかるように、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 も参照してください。 ==

4
Kusalananda