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

Recentemente ho notato che abbiamo 3 opzioni per impostare le variabili dambiente:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • Nelle shell moderne, VAR=asdf aggiorna lambiente se VAR era già nellambiente. (Questo non era ' vero nella Bourne shell originale.)

Risposta

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *