Utilizzo dell'esportazione in .bashrc


45

Ho notato nel mio .bashrcche alcune linee hanno exportdi fronte, come

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

mentre altri no, come

HISTSIZE=100000

Mi chiedo se, in primo luogo, questo sia corretto, e in secondo luogo quale sia la regola per l'utilizzo exportin .bashrc.

Risposte:


53

Hai solo bisogno exportdi variabili che dovrebbero essere "viste" da altri programmi che avvii nella shell, mentre quelle che sono usate solo all'interno della shell stessa non hanno bisogno di essere modificate export.

Questo è ciò che dice la pagina man:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Questo può essere dimostrato con quanto segue:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Spiegazione:

  • Ho prima impostato ${MYVAR}una variabile Shell con MYVAR="value". Usando echoI posso riecheggiare il suo valore perché l'eco fa parte della shell.
  • Quindi creo echo.sh. Questo è un piccolo script che sostanzialmente fa lo stesso, fa solo eco ${MYVAR}, ma la differenza è che verrà eseguito in un processo diverso perché è uno script separato.
  • Quando lo si chiama echo.shnon genera nulla, perché il nuovo processo non eredita${MYVAR}
  • Quindi esporto ${MYVAR}nel mio ambiente con la exportparola chiave
  • Quando ora eseguo di echo.shnuovo lo stesso , fa eco al contenuto di ${MYVAR}perché lo ottiene dall'ambiente

Quindi per rispondere alla tua domanda:

Dipende da dove verrà utilizzata una variabile, sia che tu debba esportarla o meno.


17

Utilizzare exportper le variabili di ambiente . Le variabili di ambiente sono una funzionalità del sistema operativo. Le variabili di ambiente sono ereditate da processi figlio: se le si imposta in una shell, sono disponibili in tutti i programmi avviati da questa shell. Le variabili utilizzate da molte applicazioni o da applicazioni specifiche diverse dalle shell sono variabili di ambiente. Ecco alcuni esempi di variabili d'ambiente comuni:

  • HOME- indica la home directory dell'utente, dove si trovano i file di configurazione per utente. Utilizzato da qualsiasi programma che legge i file di configurazione per utente o che deve comunque conoscere la posizione della home directory dell'utente.
  • PATH- indica dove trovare i file eseguibili per avviare altri programmi. Utilizzato da ogni programma che deve avviare un altro programma.
  • LD_LIBRARY_PATH- indica dove trovare i file di libreria dinamici. Utilizzato da ogni eseguibile collegato dinamicamente.
  • EDITOR, VISUAL- indica quale programma eseguire quando è necessario un editor. Utilizzato da qualsiasi programma che deve avviare un editor di testo.
  • DISPLAY, XAUTHORITY- indica come connettersi al server X11. Utilizzato dai client X11 (es. Programmi GUI).
  • LESS- le opzioni si attivano automaticamente quando lessvengono eseguite. Utilizzato da less.
  • http_proxy- indica il proxy Web da utilizzare. Utilizzato dalla maggior parte dei browser Web.

Non utilizzare exportper variabili di shell. Le variabili della shell sono una caratteristica della shell come linguaggio di programmazione. Le variabili di shell vengono utilizzate solo all'interno della shell in cui sono impostate; non hanno alcun significato per i programmi lanciati dalla shell. Le variabili della shell vengono duplicate quando viene creata una subshell, come il resto dello stato della shell. Ecco alcuni esempi di variabili shell che hanno un significato per le shell popolari:

  • PS1 - il prompt da visualizzare prima di ogni comando.
  • IFS - i caratteri che separano le parole in espansioni variabili non quotate e sostituzioni di comandi.
  • HISTFILE - un file in cui la shell scriverà la cronologia dei comandi.

Oltre alle variabili utilizzate dalla shell, la maggior parte degli script della shell utilizza le variabili per i loro scopi interni.

La maggior parte delle variabili di ambiente (ad es. PATH) Ha senso per un'intera sessione e deve essere impostata in ~/.profileun file simile. Le variabili che hanno senso solo per una shell specifica (ad es. PS1) Dovrebbero essere impostate in un file specifico della shell come ~/.bashrco ~/.zshrc. Vedi Esiste un file equivalente ".bashrc" letto da tutte le shell?


3

Per le variabili interne bash non è necessario export. Dal tuo esempio HISTTIMEFORMATviene utilizzato da bash stesso e non ha bisogno di un'esportazione MYSQL_HISTFILEè per mysqle che ha bisogno di esportazione altrimenti mysqlnon lo vede.

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.