J'exécute le script suivant:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mais je reçois:
# ./test.sh
Hello
Comment envoyer la variable VARde 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 VARde mon script au shell créé avec sh -c '...'?
Réponses:
Utilisez-le exportpour 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 $VARcontient 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"`
$0est 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.shet 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.shdevrait être recherché dans le répertoire actuel (par opposition à $PATH), il devrait être écrit. ./var_init.sh