bash
define 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 date
comando 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 date
comando, busca un comando llamado {date}
. Como no encuentra uno, se produce un error.
Otro problema común es el test
comando. 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 v
a vacío y luego ejecuta el date
comando.
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 v
con el argumento =date
. El error se debe a que no encontró ningún comando llamado v
.