2016-07-03 2 views
1

次の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において

+1

なぜあなたはそのような行動を望んでいますか?言語を正しく使用するのがはるかに難しくなります。 –

+0

@CharlesDuffy私はその行動を望んでいません。現在の動作が[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html)標準でどのように指定されているかを理解しようとしています。私が他の振る舞い(代入におけるパラメータ拡張後のフィールド分割)が、その言語を使いにくくすると思われる理由は、私は確信していません。パラメータ拡張を引用するのに既に使用されています。 'ls" $ foo "'特に課題ではそれほど難しいことではありません。 'b =" $ a "' –

+0

ところで、いくつかの改訂がありましたが、私は現在、私の答えが完全であると考えています。 –

答えて

2

、「単純なコマンド」:

シェル文法規則に従って変数代入又はリダイレクションとして認識されている単語は、ステップ3および4

の処理のために保存されています

ステップ2 - この場合は上記のテキストで明示的にスキップされますが、拡張およびフィールド分割を実行するときの割り当てを無視することを繰り返します。

w の変数割り当てまたはリダイレクトはありませんは展開されます。展開後にフィールドが残っている場合、最初のフィールドはコマンド名とみなされ、残りのフィールドはコマンドの引数になります。

したがって、それはあなたの質問に与えられたb=$a場合に対処し、(変数の割り当てやリダイレクト以外の内容に基づいて)実行するコマンドを決定ステップ2です。割り当てのための -


ステップ4行う他の拡張 - 「チルダ展開、パラメータ展開、コマンド置換、算術式展開、クォート除去」。特に、フィールドの分割はこのセットのメンバーではありません。単一のフィールドに展開され、単一の単語内で発生

チルダ展開、パラメータ展開、コマンド置換、数式展開、クォート削除の:確かに、それはこれらのどれもが、それ自体の複数の単語を作成していないことを2.6に明示的です。 1つの単語から複数のフィールドを作成できるのは、フィールド分割またはパス名展開のみです。このルールの例外は、特殊パラメータで説明しているように、二重引用符で囲まれた特殊パラメータ '@'の拡張です。

+0

'a = $ b'? 'a = $ b'全体が1つの単語と考えられていますか?あるいは 'a'は単語、' $ b'は別の単語ですか? –

+1

標準が読むように、 'a = $ b'は単一の単語です。 –

+1

これは、**が** 1つの単語でなければならないので、 '='の周りにスペースを入れることができない理由です。 – cdarke

関連する問題