Qual è l'identificatore token di `]`?


9

Bash Manual dice:

Quando viene utilizzato il [modulo, l'ultimo argomento del comando deve essere a].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Quindi ]non è una parola riservata, né è un operatore, né è un comando incorporato.

Come token, qual è l'identificatore token di ]? WORD o NAME?


4
In realtà, [è (anche) un comando autosufficiente: -rwxr-xr-x 1 radice radice 39552 3 dicembre 18:14 / usr / bin / [Anche se è possibile che ci sia anche un "parallelo" incorporato, come c'è per per esempio kill. Su alcuni sistemi, il testcomando è un collegamento simbolico [o viceversa. AFAIK, ]non significa nulla da solo, ma è accettato per "chiudere" un [- ma è più per ragioni "estetiche".
Baard Kopperud

5
Il linguaggio shell è cresciuto strato per strato negli ultimi 46 anni e la coerenza interna non è mai stata una priorità. Se si tenta di adattarlo forzatamente a qualsiasi tipo di quadro teorico formale del linguaggio, si avrà un brutto momento.
zwol,

Poiché [è (anche) un comando autonomo, di solito ha una man-page ... Quindi prova man [e / o man test( [e testpotrebbe essere lo stesso comando).
Baard Kopperud,

Prova ad applicare le ]virgolette singole o doppie e vedrai che non fa alcuna differenza; è solo una stringa.
Wildcard

Risposte:


21

]integra [, è il segno di chiusura del [comando.

Come mansottolinea la pagina, questo è in realtà un argomento [, ma [sembra trattarlo in particolare, come il finale.

Puoi assomigliarlo con altri schemi di chiusura dei comandi, ad esempio ;in find .. exec.


Grazie. Qual è il tipo / identificatore di token di ]?
Tim

8
@Tim ]non è diverso da qualsiasi altro carattere normale in questo contesto (come argomento di un comando). Il testcomando lo tratta in modo speciale, ma dipende dal comando.
Muru,

6
È solo una stringa e [genera un errore se il suo argomento finale non è esattamente uguale a ].
Chepner,

19

Bash non tratta i caratteri [o ](da soli) in modo diverso da una lettera dell'alfabeto.

In questo caso bash vede una "parola" [e cerca un comando con quel nome. Se guardi nel tuo filesystem probabilmente troverai che /bin/[(o /usr/bin/[) esiste come file eseguibile. In realtà, bash fornisce anche una versione integrata (per motivi di efficienza), ma è solo un dettaglio dell'implementazione.

Il [comando (come in, l'eseguibile con quel nome), ha una regola che dovrebbe essere l'ultimo parametro passato ]o altrimenti genera un errore. Ciò può essere in parte dovuto al fatto che è esteticamente gradevole, ma serve anche a proteggerti da comandi accidentalmente troncati, il che è carino.

Il fatto che questi non siano speciali è il motivo per cui non è possibile omettere lo spazio bianco prima e dopo [o ].


Eccezioni :

  • Quando [e si ]verificano nel formato corretto all'interno della stessa parola, ad es. [a-z], Questo è speciale e si applicano le regole di globbing di bash.
  • Il [[comando è speciale e non può fare molte cose [(ei parametri all'interno [[ .. ]]vengono elaborati in modo diverso, così come alcune interruzioni di riga). Anche il corrispondente ]]è speciale, in quanto è una parola riservata alla shell che non può essere un nome di comando e termina l'elaborazione speciale che segue la [[parola chiave.

1
@JacobKrall Non è un personaggio speciale come ;o >, è solo un comando incorporato come cd. In particolare, se si digita [x, [non ha un significato speciale.
Barmar

2
@JacobKrall Questo è vero per tutti i comandi integrati. [è un comando speciale , non è un personaggio speciale .
Barmar

@Barmar: abbastanza giusto; Ritiro i miei commenti.
Jacob Krall

In realtà ]]è più speciale di ]. Quando si usano [e ]sono solo parole. Se l'hai omesso ]o sostituito con una parola diversa, bash verrà comunque eseguito [, ma [produrrà un errore. Tuttavia [[e ]]sono trattati in modo speciale al momento dell'analisi. Se hai sostituito ]]con qualcos'altro, bash segnalerà un errore di sintassi. E se omettessi ]]bash, continueresti ad analizzare la riga successiva alla ricerca di ]].
Kasperd,

@kasperd risposta modificata.
AMS

3

Per dirla più semplicemente delle precedenti due risposte, ]è solo una stringa che [richiede l'esecuzione.


1
Questo sembra un po 'un commento ...
wizzwizz4,

@ wizzwizz4, date le domande di follow-up dell'OP nei commenti, penso che questa semplicità sia esattamente ciò di cui aveva bisogno.
Wildcard

@Wildcard Sono davvero d'accordo. C'era qualcosa che mi tentava di votare questa risposta, ma ho pensato che fosse di bassa qualità. (Non ho ancora votato!) Ho intenzione di modificare per migliorare il markup.
wizzwizz4,
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.