
Probé los siguientes comandos
variable='one|name'
echo $variable
La salida es
one|name
mientras que echo one|name
da un error No command 'name' found
. Esto es razonable porque bash lo trata |
como una tubería e intenta ejecutar el comando name
como one
entrada.
Pero ¿por qué se echo $variable
imprime one|name
? Después de la expansión de parámetros y variables, ¿no debería ser equivalente a echo one|name
?
Versión:
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
Respuesta1
No, no debería, por la forma en quebash
operar el comando.
Cuando escribe echo one|name
, bash
analiza el comando, lo trata |
como un token de canalización, por lo que |
realiza la canalización.
Cuando escribe echo $variable
, debido a que el análisis del token ocurre antes de la expansión de la variable, bash
el análisis del comando en dos partes echo
y $variable
. Después de eso, realiza una expansión variable, expandiéndose $variable
a one|name
. En este caso, one|name
es una cadena, |
es parte de una cadena y no puede tratarse como un token de canalización (por supuesto,la frase de reconocimiento simbólicoestaba hecho). Lo único que puede ser especial si IFS
la variable contiene |
, bash
se usará |
como delimitador para realizar la división de campos:
$ variable='one|name'
$ IFS='|'
$ echo $variable
one name
Respuesta2
La razón es por la forma en que Bash
se expande la variable.
En lugar de expandir la variable a, one|name
expande la variable a "one|name"
. Así que aquí, como el valor está entre comillas, se trata como una cadena en lugar de un comando.
A continuación se muestra el strace
resultado del comando que muestra cómo se expande el comando.
$ variable='one|name'
$ strace echo $variable
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0) = 0x9cc7000
Respuesta3
Las comillas son parte de la cadena que creaste.
Si lo hiciste
variable=one|name
echo $variable
el resultado sería el esperado. Pero sólo puedes hacer esto en un script (gracias por el útil comentario).