次の2つの割り当てを考えてみましょう。シェル内の代入文でパラメータ展開後にフィールド分割が行われないのはなぜですか?
$ a="foo bar"
$ b=$a
$ b=foo bar
bash: bar: command not found
なぜ2番目の割り当てが正常に機能しますか? 2番目のコマンドと3番目のコマンドとはどのような違いがありますか?
b=$a
が$a
が二重引用符で囲んで、foo bar
が引用されていないされていないので、したがって、フィールド分割を行うべき
b=foo bar
に拡大するので、私は失敗する2番目の割り当てを期待していました(私の理解によると)b=foo
は代入と見なされ、bar
は見つからないという結果になります。
要約:3番目のコマンドが失敗するのと同じ理由で2番目のコマンドが失敗することを期待していました。 2番目のコマンドが成功するのはなぜですか?
私はPOSIXを調べましたが、割り当てで発生するパラメータ拡張後にフィールド分割が行われないことを指定するものは見つかりませんでした。
私は、パラメータ展開後に引用符で囲まれていないパラメータにフィールドスプリットが発生することを意味します。たとえば、
$ a="foo bar"
$ printf "[%s] [%s]\n" $a
[foo] [bar]
Section 2.6.5を参照してください。
パラメータ展開(パラメータ拡張)、コマンド置換(コマンド置換)、及び算術膨張(算術拡張)した後、シェルは、フィールド分割のための二重引用符で発生しなかった展開および置換の結果をスキャンしなければならないが複数のフィールドが表示されます。
したがって、代入文でパラメータ拡張が発生すると、POSIX標準のどの部分でフィールドの分割が防止されますか? 2.9.1において
なぜあなたはそのような行動を望んでいますか?言語を正しく使用するのがはるかに難しくなります。 –
@CharlesDuffy私はその行動を望んでいません。現在の動作が[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html)標準でどのように指定されているかを理解しようとしています。私が他の振る舞い(代入におけるパラメータ拡張後のフィールド分割)が、その言語を使いにくくすると思われる理由は、私は確信していません。パラメータ拡張を引用するのに既に使用されています。 'ls" $ foo "'特に課題ではそれほど難しいことではありません。 'b =" $ a "' –
ところで、いくつかの改訂がありましたが、私は現在、私の答えが完全であると考えています。 –