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 $vsta effettivamente verificando nella shell chiamante, non nella shell chiamata. Ma la dichiarazione, si v=valuesta 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 $vviene sostituito dalla shell interattiva. Usa virgolette singole:
$ bash -c 'v=value;echo $v'
value