Eseguo il seguente script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ma ottengo:
# ./test.sh
Hello
Come posso inviare la variabile VAR
del mio script alla shell creata con sh -c '...'
?
Eseguo il seguente script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ma ottengo:
# ./test.sh
Hello
Come posso inviare la variabile VAR
del mio script alla shell creata con sh -c '...'
?
Risposte:
Utilizzare export
per trasformarlo in una variabile di ambiente o passarlo direttamente al comando.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Evitare l'uso di virgolette doppie attorno al codice della shell per consentire l'interpolazione in quanto introduce vulnerabilità nell'iniezione di comandi come in:
sh -c "echo 'Hello $ VAR'"
causando un riavvio se chiamato quando $VAR
contiene qualcosa di simile';reboot #
export var="Test"
in una riga.
Ecco ancora un altro modo per passare le variabili sh -c
(come argomenti posizionali):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
di funzionare come previsto, ad es. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
viene visualizzato nei messaggi di errore / avviso dalla shell.
Se non vuoi esportarli come variabili di ambiente, ecco un trucco che potresti fare. Salvare la definizione di variabe in un file .var_init.sh
e sorgente nella sotto-shell in questo modo:
.var_init.sh
VAR="Test"
dalla riga di comando:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
In questo modo, imposti le variabili solo all'esecuzione della tua sotto-shell.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
si prevede che questo venga cercato nella directory corrente (al contrario di $PATH
), dovrebbe essere scritto. ./var_init.sh