cat
当尝试在 bash 3.2 中输出包含 JSON 的定界文档时,我对这种行为感到困惑:
输入:
$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF)
输出:
{"x":["a":1]}
{"x":["b":2]}
这是怎么回事?
答案1
这只是 bash 的 shell 变量扩展。在这种情况下,花括号之间的任何内容都将被迭代并扩展到表达式中。
$ 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
大括号扩展受“braceexpand”选项的约束。例如:
set +B
cat <(cat <<EOF
{"x":[{"a":1,"b":2}]}
EOF
)
生成单个 JSON 值。