Por que o 'cat' parece iterar em matrizes JSON?

6

Estou intrigado com este comportamento de cat ao tentar produzir um heredoc contendo JSON no bash 3.2:

entrada:

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

saída:

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

O que está acontecendo?

    
por Armand 02.07.2015 / 19:31

3 respostas

10

Esta é apenas a expansão da variável shell pelo bash. Nesse contexto, o que quer que esteja entre as chaves será iterado e expandido para a expressão.

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

$ echo var{1..10}
var1 var2 var3 var4 var5 var6 var7 var8 var9 var10
    
por 02.07.2015 / 19:42
1

Não é uma resposta, mas um comentário formatado:

$ 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}]}

Coloque o parêntese de fechamento em uma nova linha

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

e, claramente, não consigo reproduzir:

$ echo $BASH_VERSION
4.3.39(1)-release
    
por 02.07.2015 / 21:05
0

A expansão de chave está sujeita à opção "braceexpand". Por exemplo:

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

produz o valor único de JSON.

    
por 08.09.2015 / 05:42