Eseguendo quanto segue da una schermata della riga di comando:
bash -c "v=value; echo $v"
non visualizza nulla. Va bene? Come posso assegnare un valore a una variabile all'interno di questo tipo di esecuzione?
Eseguendo quanto segue da una schermata della riga di comando:
bash -c "v=value; echo $v"
non visualizza nulla. Va bene? Come posso assegnare un valore a una variabile all'interno di questo tipo di esecuzione?
Risposte:
Ci sono due shell coinvolte qui:
La shell chiamante, la shell interattiva da cui si sta eseguendo questo
La shell non di accesso, non interattiva, generata da bash -c
Ora, il problema è che, tra virgolette doppie, le variabili vengono espanse ai rispettivi valori, questo vale per qualsiasi shell.
Quindi, poiché hai usato le virgolette doppie, l'espansione della variabile si $v
sta effettivamente verificando nella shell chiamante, non nella shell chiamata. Ma la dichiarazione, si v=value
sta verificando sulla shell non interattiva chiamata.
Quindi, in totale, hai la variabile definita nella shell chiamata ed espansa (in anticipo) nella shell chiamante. Poiché la variabile value non è impostata nella shell chiamante, quindi non si ottiene nulla nell'output.
Ora, per fare in modo che la definizione e l'espansione della variabile avvengano nella shell generata, usa virgolette singole o escape $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
Con le virgolette doppie $v
viene sostituito dalla shell interattiva. Usa virgolette singole:
$ bash -c 'v=value;echo $v'
value