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.