¿Cómo enviar variables a un shell-script en línea?

26

Ejecuto el siguiente script:

VAR="Test"
sh -c 'echo "Hello $VAR"'

Pero me sale:

# ./test.sh
Hello

¿Cómo puedo enviar la variable VARde mi script al shell creado con sh -c '...'?

Matthieu Napoli
fuente

Respuestas:

44

Utilícelo exportpara 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 $VARcontiene algo como';reboot #

Ignacio Vazquez-Abrams
fuente
No es realmente práctico (tengo varias variables, y no quiero que sean variables de entorno), pero funciona, ¡gracias!
Matthieu Napoli
3
@Matthieu: solo se establecen como variables de entorno para los elementos secundarios de su proceso , si eso es lo que le preocupa.
Piskvor
55
Solo para tu información, también puedes hacerlo export var="Test"en una línea.
user606723
@Piskvor bien, gracias por la precisión, eso es perfecto entonces.
Matthieu Napoli
9

Aquí hay otra forma de pasar variables a sh -c(como argumentos posicionales):

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
ben
fuente
1
(+1) Para mantenerlo más en línea con la expectativa normal de $ 1 $ 2 para las variables de script, puede tener un valor ficticio para $ 0. Esto permitirá $@trabajar como se esperaba, por ejemplo. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O
2
@ Peter.O En lugar de usar "_", usaría "sh" o un nombre sensible para dar a ese comando, ya que $0el shell lo muestra en los mensajes de error / advertencia.
Stéphane Chazelas
5

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.shy 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.

rahmu
fuente
... oENV=.var_ini.sh sh -c '...'
Kusalananda
Tenga en cuenta que si .var_init.shse espera que se busque en el directorio actual (en lugar de $PATH), debe escribirse. ./var_init.sh
Stéphane Chazelas