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

17

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

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

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Estas instruções echo exibem consistentemente 1 4 5 6. Há algo especial sobre esses 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 duplicação é relacionada e útil, mas não duplicada. A possível duplicação é da perspectiva de um comando rm . Esta questão é da perspectiva de um "comportamento estranho" percebido de um comando echo . A resposta subjacente para ambos é globbing. Alguém que pesquisar problemas com o comando echo não encontraria facilmente a questão rm , mas seria mais provável que ela fosse parar aqui.
por MikeD 27.02.2017 / 19:41

1 resposta

33

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

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

$ echo '[9876543210]'
[9876543210]

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

    
por 27.02.2017 / 19:55