Ejecutando lo siguiente desde una pantalla de línea de comando:
bash -c "v=value; echo $v"
No muestra nada. ¿Está bien? ¿Cómo puedo asignar un valor a una variable dentro de este tipo de ejecución?
Ejecutando lo siguiente desde una pantalla de línea de comando:
bash -c "v=value; echo $v"
No muestra nada. ¿Está bien? ¿Cómo puedo asignar un valor a una variable dentro de este tipo de ejecución?
Respuestas:
Aquí hay dos proyectiles involucrados:
El shell de llamada, el shell interactivo desde el que está ejecutando esto
El shell sin inicio de sesión, no interactivo, generado por bash -c
Ahora, el problema es que, entre comillas dobles, las variables se expanden a sus respectivos valores, esto es cierto para cualquier shell.
Entonces, como ha usado comillas dobles, la expansión variable $v
, en realidad está teniendo lugar en el shell de llamada, no en el shell llamado. Pero la declaración, v=value
se lleva a cabo en el llamado shell no interactivo.
Entonces, en total, tiene la variable definida en el shell llamado y expandida (de antemano) en el shell de llamada. Como la variable de valor no está establecida en el shell de llamada, por lo tanto, no obtiene nada en la salida.
Ahora, para que la definición variable y la expansión tengan lugar en el shell generado, use comillas simples o escape $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
Con comillas dobles $v
se sustituye por el shell interactivo. Use comillas simples:
$ bash -c 'v=value;echo $v'
value