eco [9876543210] exibe 1 4 5 6… por quê?

19

Por favor, explique por que 1 4 5 6 é exibido para as últimas quatro instruções de eco? Eu acertei isso por acidente uma vez, mas agora estou curioso para saber por que esse comportamento ocorre.

Essas declarações funcionam como esperado (para mim).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Essas instruções de eco exibem consistentemente 1 4 5 6. Há algo de especial nesses números?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Obrigado!

  • A possível duplicata está relacionada e é útil, mas não uma duplicata. A possível duplicata é da perspectiva de um rmcomando. Esta questão é da perspectiva de um "comportamento estranho" percebido de um echocomando. A resposta subjacente para ambos é globbing. Alguém que procurava por problemas com um echocomando não encontraria facilmente a rmpergunta, mas provavelmente chegaria aqui.
MikeD
fonte
16
você tem 4 arquivos em seu diretório atual, com os nomes: 1 4 5e6
Jeff Schaller
5
Lol, o bot em metasmoke.erwaysoftware.com/post/58973 sinaliza esta postagem como spam porque "tem um número de telefone no título" ... realmente?
Carlo Wood
2
@CarloWood, dez dígitos consecutivos correspondem a um número de telefone dos Estados Unidos com o código de área. Escrito usando formatação normal, seria 987-654-3210.
Mark
1
Observe que, se você ativar nullglob, o seu segundo exemplo ( echo [237890]) não imprimirá nada, o que poderia ter sido uma pista de que você estava vendo expansão glob nos outros exemplos.
Kyle Strand
3
Possível duplicata do trabalho de rm / ls com [0-9] #
2800 muru

Respostas:

33

O suporte aberto [é um caractere especial para o shell; ele abre um algoritmo de correspondência de padrões que diz "corresponder a qualquer um dos caracteres entre colchetes". Como você tem 4 arquivos nomeados como: 1, 4, 5 e 6 no diretório atual, quando os caracteres dentro dos colchetes contêm qualquer um desses dígitos, seu shell substitui a correspondência de padrão com esses nomes de arquivo. Quando você passar a usar echo [ 9876543210 ]você está chamando echo com 3 parâmetros: [, 9876543210, e ].

Você deve citar os parâmetros da instrução echo para impedir que o shell a veja como uma solicitação de correspondência de padrão.

$ echo '[9876543210]'
[9876543210]

(ou remova os arquivos nomeados 1, 4, 5 e 6 - mas essa é uma solução alternativa para demonstrar o comportamento, não uma correção).

Jeff Schaller
fonte
4
Talvez seja melhor dizer que echo [ 987 ]chama echocom três parâmetros do que sequer mencionar test?
dhag 27/02
2
seria mesmo! Eu respondi em excesso :(
Jeff Schaller
1
* Eu também gosto da sua versão de primeira resposta, pois eu a deparei inicialmente enquanto testava as declarações de eco de vários testes.
MikeD 27/02
1
A resposta original nem é verdadeira. Ele escreveu: eco [9876543210]. Nenhuma invocação de [(portanto, teste) é feita.
knezi
O ponto principal é que o argumento to echoé interpretado de maneira diferente, bashdependendo da existência ou não de espaços entre colchetes e o que há dentro deles. [123]vs. [ 123 ].
jskroch