Espacios al lado de las tuberías

17

He visto history | grep blahy history |grep blah; y history|grep blahtambién funciona, aunque nadie parece usarlo.

¿Hay algún significado en los espacios (p. Ej., Las tuberías hacia / desde diferentes comandos requieren un uso diferente de los espacios), o es siempre arbitrario?

EmmaV
fuente
13
Legibilidad, principalmente.
jasonwryan
1
|La ;mayoría de los shell (bash, ksh, tcsh) usan pipe o punto y coma como separador de comandos. cuando no se incluyen entre comillas, los espacios en blanco antes y después son irreverentes.
Archemar

Respuestas:

24

bashdefine varios metacaracteres . De man bash:

metacarácter
Un carácter que, cuando no se cita, separa las palabras. Uno de los siguientes:
| &; () <> pestaña espacio

Debido a que los metacaracteres separan las palabras, no importa si están rodeadas de espacios. El símbolo de la tubería |, es un metacarácter y, por lo tanto, como notó, no necesita espacios a su alrededor.

Tenga en cuenta que [, ], {, }, y =son no metacaracteres. Su significado, por el contrario, depende en gran medida de si están rodeados de espacios en blanco.

Ejemplos de cuando los espacios son y no son necesarios

Como notó, no importa si |está rodeado de espacios. Consideremos algunos ejemplos que comúnmente confunden a los usuarios de bash. Considerar:

$ (date)
Sun Mar  1 12:47:07 PST 2015

Los parens anteriores obligan al datecomando a ejecutarse en una subshell. Porque (y )son metacaracteres, no se necesitan espacios. Por el contrario:

$ {date}
bash: {date}: command not found

Desde {y }son no metacaracteres, los dulces de concha {date}como una palabra. En lugar de buscar el datecomando, busca un comando llamado {date}. Como no encuentra uno, se produce un error.

Otro problema común es el testcomando. Lo siguiente funciona con éxito:

$ [ abc ] && echo Yes
Yes

Elimine los espacios y se produce un error:

$ [abc] && echo Yes
bash: [abc]: command not found

Porque [y no] son metacaracteres, el shell trata como una sola palabra y el resultado, al igual que en el ejemplo, es un error.[.bashrc]date

Las declaraciones de asignación también son sensibles a los espacios. La siguiente asignación es exitosa:

$ v=date
$ echo $v
date

Agregue un espacio y la asignación falla:

$ v= date
Sun Mar  1 12:55:05 PST 2015

En lo anterior, la carcasa fija temporalmente va vacío y luego ejecuta el datecomando.

Agregar un espacio antes =también causa una falla, pero por una razón diferente:

$ v =date
bash: v: command not found

Aquí, el shell intenta ejecutar el comando vcon el argumento =date. El error se debe a que no encontró ningún comando llamado v.

John1024
fuente
1
Recientemente fui víctima de la declaración de asignación. Tenía espacios antes y después del =. Tomó un tiempo para depurar.
topher
3

Las tuberías le permiten usar la salida de un programa como la entrada de otro ...

En cuanto a los espacios, es sólo cuestión de facilidad de lectura / preferencia personal como @jasonwryan mencionado.

Una barra espaciadora antes y después de "|" es la norma ...

También puede usarlo con la columna -t, no solo para que su único revestimiento esté limpio, sino también para su salida.

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
zee
fuente
2

Hay un caso en el que puede ser útil no usar espacios. Si no está utilizando un diseño estadounidense, puede verse obligado a utilizar algunas combinaciones como AltShiftLingresar una tubería. Si bien esto no es un problema per se, una consecuencia es que a veces también ingresa caracteres que no se imprimen antes o después de ese carácter. Por ejemplo, en un teclado francés Macbook Pro, tengo que usar AltShiftLpara ingresar |. Cuando escribe rápidamente, puede escribir accidentalmente esto: 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

Si no sabe que AltShiftSpaceingresa un espacio diferente (el espacio sin interrupción ( U + 00A0 )), el siguiente error puede ser difícil de entender:zsh: command not found:  tail

alecail
fuente
1

El único significado de los espacios en este caso es la estética.
O, en otras palabras, útil para hacer que los comandos sean más legibles para un humano.

asoundmove
fuente