Ejecuto el siguiente script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Pero me sale:
# ./test.sh
Hello
¿Cómo puedo enviar la variable VAR
de mi script al shell creado con sh -c '...'
?
Ejecuto el siguiente script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Pero me sale:
# ./test.sh
Hello
¿Cómo puedo enviar la variable VAR
de mi script al shell creado con sh -c '...'
?
Respuestas:
Utilícelo export
para convertirlo en una variable de entorno o páselo directamente al comando.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Evite usar comillas dobles alrededor del código de shell para permitir la interpolación, ya que introduce vulnerabilidades de inyección de comandos como en:
sh -c "echo 'Hola $ VAR'"
provocando un reinicio si se llama cuando $VAR
contiene algo como';reboot #
export var="Test"
en una línea.
Aquí hay otra forma de pasar variables a sh -c
(como argumentos posicionales):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
trabajar como se esperaba, por ejemplo. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
el shell lo muestra en los mensajes de error / advertencia.
Si no desea exportarlos como variables de entorno, aquí hay un truco que podría hacer. Guarde su definición de variabe en un archivo .var_init.sh
y fuente en su sub-shell de esta manera:
.var_init.sh
VAR="Test"
desde la línea de comando:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
De esta manera, solo establece sus variables en la ejecución de su subshell.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
se espera que se busque en el directorio actual (en lugar de $PATH
), debe escribirse. ./var_init.sh