2017-03-03 2 views
0

GNU make用のMakefileを書こうとしています。私はこの問題はここにあるかを把握することはできません。私は文字列を定義しようとしていますが、X = "どちらか 'this' that '"でもGNU makeはそれを受け入れません。

foo := this|works 
bar := "I lost my 'single quotes'" 
baz := 'make|will|not|accept|this|with|the|single|quotes' 

whatIWant := "A string with its 'single|quoted|regex|alternatives'" 

this-almost-works: #But the single quotes are lost. 
     @printf '%s ' "$(whatIWant)" 

this-fails-horribly: 
     @printf '$(whatIWant)' 

私は

/bin/sh: 1: quoted: not found 
/bin/sh: 1: /bin/sh: 1: regex: not foundalternatives": not found 

blah blah Error 127 
  1. は、なぜそれがシェルでこの文字列の部分を実行しようとしている、次のエラーメッセージが表示されますか?

  2. whatIWantの内容を正確に含むように変数を定義するにはどうすればよいですか?

+1

パイプが '\'でエスケープされていますが、正しくパイプがメイクファイルの特殊文字であることがわかっている場合は – mascoj

+0

Coolです。これは、エラーメッセージを回避するのに役立ちます。なぜfooが動作するのかはわかりませんが、bazは動作しません。私はまだそれらの単一引用符が必要です。何らかの理由で彼らは消える。 –

+2

Makeは引用符を解釈せず、文字列内にあります。 '' '' @printf '%s' ""一重引用符| regex | alternatives "" "' ''で囲まれた文字列で、引用符で囲まれているので '' ' '' single | quoted | regex | alternatives'''''は引用符で囲まれた文字列であるため、引用符を失います。それは理にかなっていますか? – mascoj

答えて

1

拡張で詳しく調べる価値があるかもしれません。

変数を定義するときには、 の文字だけが効果を持つ唯一の文字です。$です。 他のすべては文字通り取られます。 代入演算子(=または:=)の周りの空白は無視されます。

foo :=  this|works 

fooリテラルテキストthis|worksが割り当てられます。同様 、

baz := 'make|will|not|accept|this|with|the|single|quotes' 

はリテラルテキストをbazから'make|will|not|accept|this|with|the|single|quotes'を割り当てます。 罰金とダンディー。今

は(あなたがシェルmake this-fails-horriblyに言ったので、おそらく)this-fails-horribly を構築することを決定します それが何かを行う前に、コマンドのブロックを拡張します。 $(whatIWant)は、"A string with its 'single|quoted|regex|alternatives'"で置き換えられます。 もう一度、罰金とダンディー。 残っているものは、一度に1行ずつシェルにそのまま渡されます。 (あなたが@プレフィックスをオフに残っていた場合を作る親切にあなたにエコーただろう) シェルが

printf '"A string with its 'single|quoted|regex|alternatives'"' 

を見ています。 今、私たちはシェル引用の土地にいます。 "A string with its single

  • '"A string with its 'は、単一引用符で囲まれた文字列である

    • printfコマンドは、1つのパラメータが渡されます。シェルは'を削除し、テキストは"A string with itsのままです。
    • singleにはメタキャラクタがないため、シェルはこれをそのまま残します。
  • 出力は、出力が出力alternatives"コマンドシェルが単一引用符で囲まれた文字列'='を見
    • にパイプされ
    • regexコマンドにパイプされ
    • quotedコマンドにパイプされ、あなたに残す引用符を削除して、という単語に追加します。alternatives

構文エラーはありません。 シェルがパイプラインを設定しようとすると、alternatives"コマンドが検索されます。 ディレクトリ内に見つからない$PATHなので、メッセージ/bin/sh: 1: /bin/sh: 1: regex: not foundalternatives": not foundで停止します。

一つの可能​​なエンコーディング:あなたはおそらく、それが最初の場所で変数定義の外に引用符を残してきれいです見つけるのに

.PHONY: this-workes-nicely 
this-workes-nicely: 
    echo $(whatIWant) 

+0

それをすべて説明してくれてありがとう。 printfの全ポイントはデバッグのためのものでしたので、私は特に '@'が私が取得しようとしていた正確なメッセージを抑制していたというコメントに感謝します。 –

関連する問題