Pregunta

x="a=b"
`echo $x`
echo $a

Espero que la segunda línea genere "a = b" y la ejecute en el contexto del shell principal, lo que resulta en una nueva variable a con valor b. Sin embargo, lo que realmente obtengo (si ingreso los comandos manualmente) es el mensaje de error después de la segunda línea, bash: a=b: command not found

¿Por qué es así?

¿Fue útil?

Solución

Es por el orden en que Bash analiza la línea de comando. Busca definiciones variables (por ejemplo a=b) antes de Realización de la sustitución de variables y comandos (p. Ej., EG en backticks). Por esto, para el momento echo $x se reemplaza por a=b, es demasiado tarde para que Bash vea esto como una definición variable y se analiza como un comando. Lo mismo habría sucedido si hubieras usado $x como el comando (en lugar de eco en backticks). Como en la respuesta de @mvds, el eval El comando se puede utilizar para obligar al comando a ser de refuerzo desde el principio, lo que significa que se reconocerá como una definición variable:

$ x="a=b"
$ `echo $x`
-bash: a=b: command not found
$ $(echo $x)  # Exact same thing, but with cleaner syntax
-bash: a=b: command not found
$ $x  # This also does the same thing, but without some extra steps
-bash: a=b: command not found
$ eval "$x"  # This will actually work
$ echo $a
b
$ a=  # Start over
$ eval "$(echo "$x")"  # Another way of doing the same thing, with extra steps
$ echo $a
b

Tenga en cuenta que al usar eval He puesto todas las referencias a $x En quotas dobles: esto es para evitar que ocurra las fases posteriores del análisis de la base (por ejemplo, la división de palabras) dos veces, dado que Bash terminará su proceso de análisis regular, luego reconocerá el eval comandar y luego rehacer todo el proceso de análisis otra vez. Es realmente fácil obtener resultados inesperados de usar eval, y esto elimina al menos parte del potencial de problemas.

Otros consejos

Probar

eval $x

(Y necesitamos 30 caracteres para que se publique esta respuesta)

Lo que hace su primera línea de eco es ejecutarse en una subshell y devuelve su valor al Callee. El mismo resultado se logra utilizando $() y es, por cierto, más fácil de usar que los backticks.

Entonces, lo que estás haciendo es correr primero echo $x (que regresa a=b). Y, debido a los backticks, a=b se devuelve al shell que intenta ejecutar esa línea como un comando que, obviamente, no funcionará.

Prueba esto en un caparazón:

$(echo ls)

Y verás claramente lo que está sucediendo.

Has probado $x ¿En ese divertido apóstrofes? Sin que echo, Echo parece ser solo para mostrar una cadena, no ejecutar comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top