(4 risposte)
Chiuso 2 anni fa.
Uno dei miei colleghi mi ha fornito una sintassi Bash che non conosco. Il mio Google foo mi ha deluso nel capire cosa fa e perché/quando dovrei usarlo.
Il comando che mi ha mandato era di questa forma:
someVariable=something
command
Inizialmente, ho pensato che questo fosse equivalente a quanto segue:
someVariable=something ; command
Oppure
someVariable=something
command
Ma questo non sembra essere il caso. Esempi:
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
A cosa serve questa sintassi? Cosa succede alla variabile che è stata impostata? Perché funziona?
Risposta accettata:
Ciò equivale a:
( export someVariable=something; command )
Questo rende someVariable
una variabile di ambiente, con il valore assegnato, ma solo per il comando in esecuzione.
Ecco le parti rilevanti di bash
manuale:
Comandi semplici
Un comando semplice è una sequenza di assegnazioni di variabili opzionali seguito da parole e reindirizzamenti separati da spazi vuoti e terminato da un operatore di controllo. La prima parola specifica il comando da eseguire e viene passata come argomento zero. Le parole rimanenti vengono passate come argomenti al comando invocato.
(...)
Espansione semplice dei comandi
Se nessun nome di comando risulta [dall'espansione del comando], le assegnazioni delle variabili influiscono sull'ambiente della shell corrente. In caso contrario, le variabili vengono aggiunte all'ambiente del comando eseguito e non influiscono sull'ambiente della shell corrente .
Nota:tieni presente che questo non è specifico di bash
, ma specificato da POSIX.
Modifica:discussione riassuntiva dai commenti nella risposta
Il motivo BAZ=JAKE echo $BAZ
, non stampa JAKE è perché la sostituzione delle variabili viene eseguita prima di ogni altra cosa. Se si ignora la sostituzione delle variabili, questo si comporta come previsto:
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]