echo [9876543210] affiche 1 4 5 6… pourquoi?

19

Veuillez expliquer pourquoi 1 4 5 6 est affiché pour les quatre dernières déclarations d'écho? J'ai frappé cela par accident une fois, mais je suis maintenant curieux de savoir pourquoi ce comportement se produit.

Ces déclarations fonctionnent comme prévu (pour moi).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Ces déclarations d'écho affichent systématiquement 1 4 5 6. Y a-t-il quelque chose de spécial à propos de ces nombres?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Merci!

  • Le doublon possible est lié et utile, mais pas un doublon. Le doublon possible est du point de vue d'une rmcommande. Cette question est du point de vue d'un "comportement étrange" perçu d'une echocommande. La réponse sous-jacente pour les deux est la globalisation. Quelqu'un recherchant des problèmes avec une echocommande ne trouverait pas facilement la rmquestion, mais atterrirait probablement ici.
MikeD
la source
16
vous avez 4 fichiers dans votre répertoire actuel, nommés: 1 4 5et6
Jeff Schaller
5
Lol, le bot de metasmoke.erwaysoftware.com/post/58973 marque ce post comme spam car il "a un numéro de téléphone dans le titre" ... vraiment?
Carlo Wood
2
@CarloWood, dix chiffres consécutifs correspondent à un numéro de téléphone américain avec l'indicatif régional. Écrit en utilisant un formatage normal, ce serait 987-654-3210.
Mark
1
Notez que si vous activez nullglob, votre deuxième exemple ( echo [237890]) n'imprimera en fait rien, ce qui aurait pu être un indice que vous voyiez glob-expansion dans les autres exemples.
Kyle Strand
3
Copie possible de Working of rm / ls avec [0-9]
muru

Réponses:

33

La parenthèse ouverte [est un caractère spécial à la coquille; il ouvre un algorithme de correspondance de modèle qui dit "correspondre à l'un des caractères à l'intérieur des crochets". Parce que vous avez 4 fichiers nommés: 1, 4, 5 et 6 dans votre répertoire actuel, lorsque les caractères à l'intérieur des crochets contiennent l'un de ces chiffres, votre shell remplace la correspondance de modèle par ces noms de fichiers. Lorsque vous utilisez à la placeecho [ 9876543210 ] que vous appelez écho avec 3 paramètres: [, 9876543210et ].

Vous devez citer les paramètres de votre instruction echo pour empêcher le shell de le voir comme une demande de correspondance de modèle.

$ echo '[9876543210]'
[9876543210]

(ou supprimez les fichiers nommés 1, 4, 5 et 6 - mais c'est une solution de contournement pour démontrer le comportement, pas un correctif).

Jeff Schaller
la source
4
Peut-être serait-il préférable de dire que les echo [ 987 ]appels echoà trois paramètres plutôt que de mentionner test?
dhag
2
ce serait en effet! J'ai trop répondu :(
Jeff Schaller
1
* J'aime aussi votre première version de réponse, car je l'ai d'abord rencontrée en essayant des déclarations d'écho de divers tests.
MikeD
1
La réponse originale n'est même pas vraie. Il a écrit: echo [9876543210]. Aucune invocation de [(donc test) n'est effectuée.
knezi
Le point clé est que l'argument to echoest interprété différemment en bashfonction de la présence ou non d'espaces entre les crochets et de leur contenu. [123]par rapport à [ 123 ].
jskroch