bashdefinisce diversi metacaratteri . Da man bash:
metacarattere
Un personaggio che, quando non quotato, separa le parole. Uno dei seguenti:
| &; () <> scheda spazio
Poiché i metacaratteri separano le parole, non importa se sono circondati da spazi. Il simbolo della pipa |, è un metacarattere e quindi, come hai notato, non ha bisogno di spazi attorno.
Si noti che [, ], {, }, e =sono senza metacaratteri. Il loro significato, al contrario, dipende fortemente dal fatto che siano circondati da spazi vuoti.
Esempi di quando gli spazi sono e non sono necessari
Come hai notato, non importa se |è circondato da spazi. Consideriamo alcuni esempi che comunemente confondono gli utenti bash. Ritenere:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Le parentesi precedenti obbligano l' dateesecuzione del comando in una subshell. Perché (e )sono metacaratteri, non sono necessari spazi. Al contrario:
$ {date}
bash: {date}: command not found
Poiché {e non} sono metacaratteri, la shell considera una parola. Invece di cercare il comando, cerca un comando denominato . Perché non ne trova uno, si verifica un errore.{date}date{date}
Un altro problema comune è il testcomando. Di seguito funziona correttamente:
$ [ abc ] && echo Yes
Yes
Rimuovere gli spazi e si verifica un errore:
$ [abc] && echo Yes
bash: [abc]: command not found
Poiché [e non] sono metacaratteri, la shell considera una singola parola e il risultato, proprio come nell'esempio, è un errore.[.bashrc]date
Anche le dichiarazioni di assegnazione sono sensibili agli spazi. La seguente assegnazione ha esito positivo:
$ v=date
$ echo $v
date
Aggiungi uno spazio e l'assegnazione non riesce:
$ v= date
Sun Mar 1 12:55:05 PST 2015
In quanto sopra, la shell temporaneamente imposta vsu vuoto e quindi esegue il datecomando.
L'aggiunta di uno spazio prima =causa anche un errore ma per un motivo diverso:
$ v =date
bash: v: command not found
Qui, la shell tenta di eseguire il comando vcon l'argomento =date. L'errore è perché non è stato trovato alcun comando denominato v.