「cat」がJSON配列を繰り返すように見えるのはなぜですか?

「cat」がJSON配列を繰り返すように見えるのはなぜですか?

catBash 3.2でJSONを含む区切り文書を出力しようとすると、この動作により混乱しました。

入力する:

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF)

出力:

{"x":["a":1]}
{"x":["b":2]}

どうなりますか?

答え1

これは単にbashのシェル変数拡張です。この場合、中かっこの間のすべての項目が繰り返され、式に展開されます。

$ echo var{1,2,3,4}
var1 var2 var3 var4

$ echo var{1..10}
var1 var2 var3 var4 var5 var6 var7 var8 var9 var10

答え2

答えではありませんが、フォーマットされた説明です。

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF)
bash: warning: here-document at line 15 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 15 delimited by end-of-file (wanted `EOF')
{"x":[{"a":1,"b":2}]}

新しい行に右括弧を入れます

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF
> )
{"x":[{"a":1,"b":2}]}

明らかに再現できません。

$ echo $BASH_VERSION
4.3.39(1)-release

答え3

Brace拡張には「braceexpand」オプションが適用されます。たとえば、

set +B
cat <(cat <<EOF
{"x":[{"a":1,"b":2}]}
EOF
)

単一のJSON値を生成します。

関連情報