Comment envoyer une variable à un script shell en ligne?

26

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 '...'?

Matthieu Napoli
la source

Réponses:

44

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 #

Ignacio Vazquez-Abrams
la source
Pas vraiment pratique (j'ai plusieurs variables, et je ne veux pas qu'elles soient des variables d'environnement), mais ça marche, merci!
Matthieu Napoli
3
@Matthieu: Elles ne sont définies que comme variables d'environnement pour les enfants de votre processus , si c'est ce qui vous inquiète.
Piskvor
5
Juste pour info, vous pouvez également faire export var="Test"en une seule ligne.
user606723
@Piskvor bien merci pour la précision, c'est parfait alors.
Matthieu Napoli
9

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"
}
ben
la source
1
(+1) Pour le maintenir plus conforme à l'attente normale de $ 1 $ 2 pour les variables de script, il peut avoir une valeur fictive pour $ 0. Cela permettra $@de travailler comme prévu, par exemple. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O
2
@ Peter.O Plutôt que d'utiliser "_", j'utiliserais "sh" ou un nom raisonnable pour donner à cette commande, car cela $0est affiché dans les messages d'erreur / d'avertissement par le shell.
Stéphane Chazelas
5

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.

rahmu
la source
... ouENV=.var_ini.sh sh -c '...'
Kusalananda
Notez que si cela .var_init.shdevrait être recherché dans le répertoire actuel (par opposition à $PATH), il devrait être écrit. ./var_init.sh
Stéphane Chazelas