Differenza tra "a = b" e "export a = b" in bash


45

Qual è la differenza tra:

a=b

e

export a=b

In bash?

Capisco che entrambi definiscono le variabili di ambiente, ma non capisco appieno la differenza.


Qualcuno potrebbe modificare questo? Questo non è affatto collegato a Linux, ma dipende solo dalla shell che stai usando. Credo che sia bash qui, che funziona anche su Windows.
innaM

Sono corretto.
Adam Matan

Risposte:


50

export propaga la variabile in sottoprocessi.

Ad esempio, se l'hai fatto

FOO=bar

quindi un sottoprocesso che controlla FOO non trova la variabile mentre

export FOO=bar

consentirebbe al sottoprocesso di trovarlo.

Ma se FOO ha già stato definito come una variabile di ambiente, quindi FOO=bar modificherà il valore di tale variabile d'ambiente.

Per esempio:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Le shell meno recenti non supportavano il export FOO=bar sintassi; dovevi scrivere FOO=bar; export FOO.


31
In realtà, se non usi " export ", non stai definendo una variabile di ambiente, ma solo una variabile di shell Le variabili di shell sono disponibili solo per il processo shell, le variabili di ambiente sono disponibili per qualunque processo successivo, non solo shell. Inoltre, le subshell sono comandi racchiusi tra parentesi, che hanno accesso alle variabili di shell, mentre ciò di cui si sta parlando sono i processi figli che sono shell.
wfaulk

Dove sono memorizzati?
HDave

27

Se non lo usi export, non stai definendo una variabile di ambiente; solo una variabile di shell.

Le variabili Shell sono disponibili solo per il processo shell; le variabili di ambiente sono disponibili per qualsiasi processo successivo, non solo per le shell.


2

Inoltre, se vuoi che la variabile sia disponibile alla shell chiamante senza usare l'esportazione, puoi farlo:

Il file a.ksh è -

#!/bin/ksh
FOO=bar

Al prompt, eseguire questo è

> . a.ksh

Questo eseguirà i comandi all'interno della stessa shell e $ FOO sarà disponibile.

Mentre,

> a.ksh

Renderà $ FOO disponibile solo all'interno di a.ksh, dopo la chiamata a a.ksh non esisterebbe.


1
Corretta. Nota che "." è solo una scorciatoia per "source", che a volte è usata negli script per una migliore leggibilità. Vedi "aiuto". o "help source" per i dettagli.
sleske

1

Oltre a ciò che è già stato risposto, entrambe queste istruzioni non definiscono necessariamente (cioè crea vs set) una variabile di ambiente come "a" potrebbe già esistere come shell o variabile di ambiente.

In quest'ultimo caso, entrambe le affermazioni sono strettamente equivalenti.

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.