Consideriamo un esempio specifico. Il grep
comando utilizza una variabile di ambiente chiamata GREP_OPTIONS
per impostare le opzioni predefinite.
Adesso. Dato che il file test.txt
contiene le seguenti righe:
line one
line two
l'esecuzione del comando grep one test.txt
restituirà
line one
Se esegui grep con l' -v
opzione, restituirà le righe non corrispondenti, quindi l'output sarà
line two
Proveremo ora a impostare l'opzione con una variabile ambientale.
Le variabili di ambiente impostate senza export
non verranno ereditate nell'ambiente dei comandi che si stanno chiamando.
GREP_OPTIONS='-v'
grep one test.txt
Il risultato:
line one
Ovviamente, l'opzione -v
non è stata passata a grep
.
Si desidera utilizzare questo modulo quando si imposta una variabile da utilizzare solo per la shell, ad esempio for i in * ; do
non si desidera esportare $i
.
Tuttavia, la variabile viene passata all'ambiente di quella particolare riga di comando, quindi puoi farlo
GREP_OPTIONS='-v' grep one test.txt
che restituirà il previsto
line two
Si utilizza questo modulo per modificare temporaneamente l'ambiente di questa particolare istanza del programma avviato.
L'esportazione di una variabile provoca l'ereditarietà della variabile:
export GREP_OPTIONS='-v'
grep one test.txt
ritorna ora
line two
Questo è il modo più comune di impostare variabili per l'uso di processi avviati successivamente in una shell
Tutto questo è stato fatto in bash. export
è un built-in bash; VAR=whatever
è la sintassi bash. env
, d'altra parte, è un programma in sé. Quando env
viene chiamato, accadono le seguenti cose:
- Il comando
env
viene eseguito come nuovo processo
env
modifica l'ambiente e
- chiama il comando fornito come argomento. Il
env
processo è sostituito dal command
processo.
Esempio:
env GREP_OPTIONS='-v' grep one test.txt
Questo comando avvierà due nuovi processi: (i) env e (ii) grep (in realtà, il secondo processo sostituirà il primo). Dal punto di vista del grep
processo, il risultato è esattamente lo stesso della corsa
GREP_OPTIONS='-v' grep one test.txt
Tuttavia, puoi usare questo idioma se sei al di fuori di bash o non vuoi lanciare un'altra shell (ad esempio, quando usi la exec()
famiglia di funzioni anziché la system()
chiamata).
Nota aggiuntiva su #!/usr/bin/env
Questo è anche il motivo per cui il linguaggio #!/usr/bin/env interpreter
è usato piuttosto che #!/usr/bin/interpreter
. env
non richiede un percorso completo per un programma, perché usa la execvp()
funzione che cerca attraverso la PATH
variabile proprio come fa una shell, e quindi si sostituisce con l'esecuzione del comando. Pertanto, può essere utilizzato per scoprire dove un interprete (come perl o python) "si siede" sul percorso.
Significa anche che modificando il percorso corrente puoi influenzare quale variante di python verrà chiamata. Ciò rende possibile quanto segue:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
invece di lanciare Calibre, si tradurrà in
I am an evil interpreter!
export key=value
è una sintassi estesa e non deve essere utilizzata negli script portatili (ad es#! /bin/sh
.).