echo [9876543210] visualizza 1 4 5 6 ... perché?


19

Spiegare perché 1 4 5 6 viene visualizzato per le ultime quattro dichiarazioni di eco? L'ho colpito per caso una volta, ma ora sono curioso di sapere perché questo comportamento si verifica.

Queste dichiarazioni funzionano come previsto (per me).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Queste dichiarazioni di eco mostrano costantemente 1 4 5 6. C'è qualcosa di speciale in questi numeri?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Grazie!

  • Il possibile duplicato è correlato e utile, ma non un duplicato. Il possibile duplicato è dalla prospettiva di un rmcomando. Questa domanda è dal punto di vista di un "comportamento strano" percepito di un echocomando. La risposta di fondo per entrambi è sconvolgente. Qualcuno alla ricerca di problemi con un echocomando non troverebbe facilmente la rmdomanda, ma molto probabilmente atterrerebbe qui.

16
hai 4 file nella tua directory corrente, chiamati: 1 4 5e6
Jeff Schaller

5
Lol, il bot di metasmoke.erwaysoftware.com/post/58973 contrassegna questo post come spam perché "ha un numero di telefono nel titolo" ... davvero?
Carlo Wood,

2
@CarloWood, dieci cifre consecutive corrispondono a un numero di telefono degli Stati Uniti con prefisso. Scritto usando la normale formattazione, sarebbe 987-654-3210.
Segna il

1
Nota che se attivi nullglob, il tuo secondo esempio ( echo [237890]) in realtà non stamperà nulla, il che potrebbe essere stato un indizio che stavi vedendo l'espansione globale negli altri esempi.
Kyle Strand,

3
Possibile duplicato di Working of rm / ls con [0-9]
muru,

Risposte:


33

La parentesi aperta [è un carattere speciale per la shell; apre un algoritmo di corrispondenza del modello che dice "abbina uno dei caratteri tra parentesi". Poiché nella directory corrente sono presenti 4 file denominati: 1, 4, 5 e 6, quando i caratteri tra parentesi contengono una di quelle cifre, la shell sostituisce la corrispondenza del modello con quei nomi di file. Quando si utilizza invece echo [ 9876543210 ]si sta chiamando eco con 3 parametri: [, 9876543210, e ].

Dovresti citare i parametri dell'istruzione echo per impedire alla shell di vederla come una richiesta di corrispondenza del modello.

$ echo '[9876543210]'
[9876543210]

(o rimuovi i file denominati 1, 4, 5 e 6, ma questa è una soluzione alternativa per dimostrare il comportamento, non una correzione).


4
Forse sarebbe meglio dire che echo [ 987 ]chiama echocon tre parametri piuttosto che menzionarlo test?
Dhag,

2
sarebbe davvero! Ho risposto in modo eccessivo :(
Jeff Schaller

1
* Mi piace anche la tua prima versione di risposta, poiché inizialmente mi sono imbattuto in questo mentre provavo dichiarazioni di eco di vari test.
MikeD,

1
La risposta originale non è nemmeno vera. Ha scritto: echo [9876543210]. Non viene effettuata alcuna chiamata a [(quindi test).
knezi,

Il punto chiave è che l'argomento to echoviene interpretato in modo diverso a bashseconda che ci siano o meno spazi tra le parentesi quadre e cosa c'è al loro interno. [123]vs [ 123 ].
jskroch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.