Recentemente ho notato che abbiamo 3 opzioni per impostare le variabili dambiente:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Se ci sono altri modi, illuminaci.
Quando dovrei preferire uno rispetto allaltro? Per favore suggerisci linee guida.
Per quanto riguarda la compatibilità della shell, qual è la più ampia (copre più dialetti della shell)?
Ho già notato questo risposta ma desidero espandere la domanda con env
e le linee guida sulle preferenze di utilizzo.
Risposta
export VARIABLE_NAME="some value"
è il modo per impostare una variabile di ambiente in qualsiasi shell conforme a POSIX (sh
, dash
, bash
, ksh
, ecc .; anche zsh). Se la variabile ha già un valore, puoi utilizzare export VARIABLE_NAME
per renderla una variabile di ambiente senza modificarne il valore.
Pre-POSIX Bourne shell non lo supportavano, motivo per cui” vedrai script che evitano export VARIABLE_NAME="some value"
e utilizzano VARIABLE_NAME="some value"; export VARIABLE_NAME
invece. Ma le Bourne shell pre-POSIX sono estremamente rare al giorno doggi.
setenv VARIABLE_NAME="some value"
è la sintassi csh per impostare una variabile dambiente. setenv
non esiste in sh, e csh è usato estremamente raramente negli script ed è stato superato da bash per luso interattivo negli ultimi 20 anni (e zsh ancora più a lungo), quindi puoi dimenticartene a meno che lo incontri.
Il comando env
è molto raramente utile tranne che nelle righe di shebang . Se invocato senza argomenti, mostra lambiente, ma export
lo fa meglio (ordinato e spesso citato per disambigua te newline nei valori da newline che separano i valori). Quando viene richiamato con argomenti, esegue un comando con variabili dambiente extra, ma funziona anche lo stesso comando senza env
(VAR=value mycommand
esegue mycommand
con VAR
impostato su value
, proprio come env VAR=value mycommand
). Il motivo per cui env
è utile nella riga di shebang è che esegue la PATH
ricerca e capita di non fare nientaltro se invocato con un comando nome. Il comando env
può essere utile per eseguire un comando con solo poche variabili di ambiente con -i
o senza parametri per visualizzare lambiente comprese le variabili con nomi non validi che la shell non “importa.
Risposta
Impostazione di una variabile come VAR="asdf"
lascia lambiente non modificato, il che significa che i programmi che avvii nella stessa sessione non sapranno nulla di VAR
e non saranno in grado di accedervi. Questo comportamento si desidera quando si scrivono script di shell .
export
, daltra parte, è un builtin bash che modifica lambiente rendendo così visibile la variabile esportata per i processi figli generati nella sessione corrente. può ottenere lo stesso risultato eseguendo VAR="asdf" %program_name%
.
env
non è un builtin, ma un programma a sé stante. la superficie funziona esattamente come quando VAR="asdf" %program_name%
, ma al livello più basso le cose si complicano un po . Innanzitutto, viene avviato il env
. Modifica lambiente, quindi esegue il comando con gli argomenti dati. Lo stesso comportamento che puoi ottenere nel tuo codice utilizzando la chiamata di sistema exec (3) .
setenv
è solo export
nelle shell csh-family, come indicato nella tua risposta.
Commenti
Risposta
Ci sono diverse domande con risposte che rispondono a questa domanda:
-
Differenza tra le variabili di shell che vengono esportate e quelle che non sono in bash
-
Qual è la differenza di utilizzo tra le variabili di shell e le variabili di ambiente?
(ecc.)
VAR=asdf
aggiorna lambiente seVAR
era già nellambiente. (Questo non era ' vero nella Bourne shell originale.)