echo [9876543210] muestra 1 4 5 6 ... ¿por qué?

19

¿Por qué se muestra 1 4 5 6 para las últimas cuatro declaraciones de eco? Golpeé esto por accidente una vez, pero ahora tengo curiosidad por saber por qué ocurre este comportamiento.

Estas declaraciones funcionan como se esperaba (para mí).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Estas declaraciones de eco muestran constantemente 1 4 5 6. ¿Hay algo especial en estos 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

¡Gracias!

  • El posible duplicado está relacionado y es útil, pero no es un duplicado. El posible duplicado es desde la perspectiva de un rmcomando. Esta pregunta es desde la perspectiva de un "comportamiento extraño" percibido de un echocomando. La respuesta subyacente para ambos es global. Alguien que busca problemas con un echocomando no encontraría fácilmente la rmpregunta, pero probablemente aterrizaría aquí.
MikeD
fuente
16
tiene 4 archivos en su directorio actual, llamado: 1 4 5y6
Jeff Schaller
55
Lol, el bot en metasmoke.erwaysoftware.com/post/58973 marca esta publicación como spam porque "tiene un número de teléfono en el título" ... ¿en serio?
Carlo Wood
2
@CarloWood, diez dígitos consecutivos coinciden con un número de teléfono de Estados Unidos con código de área. Escrito usando el formato normal, sería 987-654-3210.
Mark
1
Tenga en cuenta que si activa nullglob, su segundo ejemplo ( echo [237890]) en realidad no imprimirá nada, lo que podría haber sido una pista de que estaba viendo expansión global en los otros ejemplos.
Kyle Strand
3
Posible duplicado del funcionamiento de rm / ls con [0-9]
muru

Respuestas:

33

El corchete abierto [es un carácter especial para el caparazón; abre un algoritmo de coincidencia de patrones que dice "coincide con cualquiera de los caracteres dentro de los corchetes". Debido a que tiene 4 archivos nombrados como: 1, 4, 5 y 6 en su directorio actual, cuando los caracteres dentro de los corchetes contienen cualquiera de esos dígitos, su shell reemplaza la coincidencia de patrones con esos nombres de archivo. Cuando se utiliza en lugar echo [ 9876543210 ]que está llamando eco con 3 parámetros: [, 9876543210, y ].

Debe citar los parámetros de su declaración de eco para evitar que el shell lo vea como una solicitud de coincidencia de patrón.

$ echo '[9876543210]'
[9876543210]

(o elimine los archivos denominados 1, 4, 5 y 6, pero esa es una solución alternativa para demostrar el comportamiento, no una solución).

Jeff Schaller
fuente
44
¿Quizás sería mejor decir que las echo [ 987 ]llamadas echocon tres parámetros que mencionar test?
dhag
2
de hecho lo haría! Respondí en exceso :(
Jeff Schaller
1
* También me gusta su primera versión de respuesta, ya que inicialmente me encontré con esto al probar declaraciones de eco de varias pruebas.
MikeD
1
La respuesta original ni siquiera es cierta. Él escribió: echo [9876543210]. No se realiza la invocación de [(por lo tanto, prueba).
knezi
El punto clave es que el argumento to echose interpreta de manera diferente bashdependiendo de si hay espacios entre los corchetes y qué hay dentro de ellos. [123]vs [ 123 ].
jskroch