2017-01-04 3 views
1

にように私はいつも、私はbashで)$(引用符で囲む必要があります考えた:

$ FOO=$(echo "foo  bar") 
$ echo "$FOO" 
foo  bar 

FOO="$(echo "bar baz")" 

が、どうやら、これは、少なくとも中の変数の代入不要です

一方、変数に複数の単語を代入しようとすると、「次のコマンドの継続時間に変数を設定する」と解釈されるため、エラーが発生します。

また
$ FOO=bar  fooooo 
fooooo: command not found 

、私はちょうど非割り当てコンテキストで引用符せずに$()を使用している場合、彼らは再び別の言葉として扱わだ:だから

$ echo $(echo "baa beee") 
baa beee 

何ですか$()とインタラクションに関するルールと非クォートバリアントはどれくらい安全ですか?私はマンページ引用や他の権威ある参考文献に特に感謝します。また、ここに「良い練習/スタイル」がありますか?

+0

重複したリンクをありがとう!私は自分で見つけられませんでした。 – akavel

答えて

4

簡単に言えば、通常の動作を抑制するためには引用符が必要です。ほとんどのコンテキストでは、単語分割とパス名の拡張を抑止するためにコマンド置換を引用する必要があります。 「コマンド置換」の下のmanページから

は、:

If the [command] substitution appears within double quotes, word 
splitting and pathname expansion are not performed on the results. 

しかし、代入の右辺は、これらのコンテキストの一つではありません。マニュアルページの "PARAMETERS"より:

A variable may be assigned to by a statement of the form 

       name=[value] 

If value is not given, the variable is assigned the null string. All values 
undergo tilde expansion, parameter and variable expansion, command substitution, 
arithmetic expansion, and quote removal (see EXPANSION below). 

単語分割もパス名拡張も言及されていません。

疑いがある場合は、一般的に展開を引用してください。 時には、拡張の単語分割とパス名の拡張が珍しく、通常は明白です。

関連する問題