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?


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.


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

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.