Come inviare variabili a uno shell-script inline?


26

Eseguo il seguente script:

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

Ma ottengo:

# ./test.sh
Hello

Come posso inviare la variabile VARdel mio script alla shell creata con sh -c '...'?

Risposte:


44

Utilizzare exportper 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 $VARcontiene qualcosa di simile';reboot #


Non molto pratico (ho diverse variabili e non voglio che siano variabili d'ambiente), ma funziona, grazie!
Matthieu Napoli,

3
@Matthieu: sono impostati solo come variabili d'ambiente per i bambini del tuo processo , se è questo che ti preoccupa.
Piskvor,

5
Cordiali saluti, puoi anche fare export var="Test"in una riga.
user606723

@Piskvor, grazie per la precisione, allora è perfetto.
Matthieu Napoli,

9

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"
}

1
(+1) Per mantenerlo più in linea con le normali aspettative di $ 1 $ 2 per le variabili dello script, può avere un valore fittizio per $ 0. Ciò consentirà $@di funzionare come previsto, ad es. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O

2
@ Peter.O Invece di usare "_", userei "sh" o un nome sensibile da dare a quel comando, dato che $0viene visualizzato nei messaggi di errore / avviso dalla shell.
Stéphane Chazelas,

5

Se non vuoi esportarli come variabili di ambiente, ecco un trucco che potresti fare. Salvare la definizione di variabe in un file .var_init.she 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.


... oppureENV=.var_ini.sh sh -c '...'
Kusalananda

Si noti che se .var_init.shsi prevede che questo venga cercato nella directory corrente (al contrario di $PATH), dovrebbe essere scritto. ./var_init.sh
Stéphane Chazelas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.