GNU/Linux >> Linux Esercitazione >  >> Linux

Questa sintassi Shell/bash:Somevariable=somevalue Somecommand?

Questa domanda ha già risposte qui :È portatile shell per eseguire un comando sulla stessa riga dopo l'assegnazione di variabili?

(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.

Correlati:Debian – Perché la condivisione CIFS mostra gli stessi file più volte?

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
[]

Linux
  1. Esercitazione sullo stato di uscita di Bash Shell con esempi pratici

  2. 15 utili comandi integrati di Bash Shell (con esempi)

  3. Comprensione delle variabili in Bash Shell sotto Linux

  4. Script bash:utilizzo del comando script da uno script bash per la registrazione di una sessione

  5. Qual è il significato di `! -d` in questo comando Bash?

Bash wait Comando

Comando Bash printf

Come utilizzare il comando Declare in Linux Bash Shell

Bash Beginner Series #2:Comprensione delle variabili nello scripting di Bash Shell

Utilizzo della funzione di cronologia su Bash Shell su Ubuntu 16.04 LTS Server

Comando Bash fc:utilizza facilmente Bash Shell come un professionista