Spazi vicino ai tubi


17

Ho visto history | grep blahe history |grep blah; e history|grep blahfunziona anche, anche se nessuno sembra mai usarlo.

C'è qualche significato negli spazi (ad es. Il piping da / per comandi diversi richiede un uso diverso degli spazi) o è sempre arbitrario?


13
Leggibilità, soprattutto.
Jasonwryan,

1
|pipe o ;punto e virgola sono usati dalla maggior parte delle shell (bash, ksh, tcsh) come separatore di comandi. quando non sono racchiusi tra virgolette, gli spazi bianchi prima e dopo sono irriverenti.
Archemar

Risposte:


24

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.


1
Di recente sono stato vittima della dichiarazione di incarico. Ho avuto spazi prima e dopo il =. Ci è voluto del tempo per eseguire il debug.
inizio

3

I tubi ti consentono di utilizzare l'output di un programma come input di un altro ...

Per quanto riguarda gli spazi, è solo questione di leggibilità / preferenze del personale come @jasonwryan.

Una barra spaziatrice prima e dopo "|" è la norma ....

Puoi anche usarlo con la colonna -t, non solo per rendere pulito il tuo unico liner, ma anche il tuo output.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp

2

C'è un caso in cui può essere utile non usare spazi. Se non stai utilizzando un layout americano-americano, potresti essere costretto a utilizzare alcune combinazioni come AltShiftLinserire una pipe. Sebbene questo non sia un problema di per sé, una conseguenza è che a volte inserisci anche caratteri non stampabili prima o dopo quel carattere. Ad esempio, su una tastiera francese per Macbook Pro, devo usare AltShiftLl'input |. Quando si digita rapidamente, è possibile digitare questo per errore: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

Se non si è consapevoli del fatto che viene AltShiftSpaceimmesso uno spazio diverso (lo spazio di non interruzione ( U + 00A0 )), può essere difficile comprendere il seguente errore:zsh: command not found:  tail


1

L'unico significato degli spazi in questo caso è l'estetica.
O in altre parole utile per rendere i comandi più leggibili per un essere umano.

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.