Qual è la differenza tra env, setenv, export e quando utilizzare?


18

Di recente ho notato che abbiamo 3 opzioni per impostare le variabili di ambiente:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Se ci sono altri modi, per favore illuminaci.

Quando dovrei preferire l'uno all'altro? Si prega di suggerire linee guida.

Per quanto riguarda la compatibilità della shell, qual è la più estesa (copre più dialetti della shell)?

Ho già notato questa risposta, ma desidero espandere la domanda con enve le linee guida sulle preferenze di utilizzo.

Risposte:


14

export VARIABLE_NAME='some value'è il modo per impostare una variabile di ambiente in qualsiasi shell POSIX ( sh, dash, bash, ksh, ecc .; anche zsh). Se la variabile ha già un valore, è possibile utilizzare export VARIABLE_NAMEper renderla una variabile di ambiente senza modificarne il valore.

Le shell Bourne Pre-POSIX non lo supportano, motivo per cui vedrai invece script che evitano export VARIABLE_NAME='some value'e usano VARIABLE_NAME='some value'; export VARIABLE_NAME. Ma le shell Bourne pre-POSIX sono estremamente rare al giorno d'oggi.

setenv VARIABLE_NAME='some value'è la sintassi csh per impostare una variabile di ambiente. setenvnon esiste in sh, e csh è estremamente raramente usato negli script ed è stato superato da bash per uso interattivo negli ultimi 20 anni (e zsh per un periodo ancora più lungo), quindi puoi dimenticartene a meno che non lo incontri.

Il envcomando è molto raramente utile tranne che nelle righe shebang . Quando viene invocato senza argomenti, visualizza l'ambiente, ma lo exportfa meglio (ordinato e spesso citato per disambiguare le nuove righe nei valori dalle nuove righe che separano i valori). Quando viene invocato con argomenti, esegue un comando con variabili di ambiente aggiuntive, ma lo stesso comando senza envfunziona anche ( VAR=value mycommandfunziona mycommandcon VARset to value, proprio come env VAR=value mycommand). Il motivo envè utile nella riga shebang è che esegue la PATHricerca e non fa altro se invocato con un nome di comando. Il envcomando può essere utile per eseguire un comando con solo poche variabili di ambiente con-io senza parametri per visualizzare l'ambiente, comprese le variabili con nomi non validi che la shell non importa.


3

L'impostazione di una variabile come VAR='asdf'lascia l'ambiente non modificato, il che significa che i programmi che avvii nella stessa sessione non sapranno nulla VARe non potranno accedervi. Questo comportamento si desidera quando si scrivono script di shell.

exportd'altra parte, è un builtin bash che modifica l'ambiente rendendo così visibile la variabile esportata per i processi figlio generati nella sessione corrente. Puoi ottenere lo stesso eseguendo VAR='asdf' %program_name%.

envnon è un built-in, ma un programma da solo. In superficie funziona esattamente come quando tu VAR='asdf' %program_name%, ma al livello inferiore le cose diventano un po 'più complicate. Innanzitutto, envviene avviato. Modifica l'ambiente, quindi esegue il comando con determinati argomenti. Lo stesso comportamento che puoi ottenere nel tuo codice usando la chiamata di sistema exec (3) .

setenvè solo exportnelle shell della famiglia csh, come indicato nella tua risposta.


2
Nelle moderne shell, VAR=asdfaggiorna l'ambiente se VARera già nell'ambiente. (Questo non era vero nella shell originale di Bourne.)
Gilles 'SO- smetti di essere malvagio' il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.