J'exécute le script suivant:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mais je reçois:
# ./test.sh
Hello
Comment envoyer la variable VAR
de mon script au shell créé avec sh -c '...'
?
J'exécute le script suivant:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mais je reçois:
# ./test.sh
Hello
Comment envoyer la variable VAR
de mon script au shell créé avec sh -c '...'
?
Réponses:
Utilisez-le export
pour le transformer en variable d'environnement ou passez-le directement à la commande.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Évitez d'utiliser des guillemets doubles autour du code shell pour permettre l'interpolation car cela introduit des vulnérabilités d'injection de commande comme dans:
sh -c "echo 'Bonjour $ VAR'"
provoquant un redémarrage si appelé quand $VAR
contient quelque chose comme';reboot #
export var="Test"
en une seule ligne.
Voici encore une autre façon de passer des variables sh -c
(en tant qu'arguments positionnels):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
de travailler comme prévu, par exemple. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
est affiché dans les messages d'erreur / d'avertissement par le shell.
Si vous ne voulez pas les exporter en tant que variables d'environnement, voici une astuce que vous pourriez faire. Enregistrez votre définition de variable dans un fichier .var_init.sh
et sourcez-la dans votre sous-shell comme ceci:
.var_init.sh
VAR="Test"
à partir de la ligne de commande:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
De cette façon, vous ne définissez vos variables qu'à l'exécution de votre sous-shell.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
devrait être recherché dans le répertoire actuel (par opposition à $PATH
), il devrait être écrit. ./var_init.sh