Diferencia entre "a = b" y "exportar a = b" en bash

50

Cuál es la diferencia entre:

a=b

y

export a=b

En bash?

Entiendo que ambos definen variables de entorno, pero no entiendo completamente la diferencia.

Adam Matan
fuente
¿Alguien podría editar esto? Esto no está relacionado en absoluto con Linux, sino que depende solo del shell que está utilizando. Supongo que es bash aquí, que también funciona en Windows.
innaM
Estoy corregido.
Adam Matan el

Respuestas:

54

export propaga la variable a subprocesos.

Por ejemplo, si lo hiciste

FOO=bar

entonces un subproceso que verificó FOO no encontraría la variable mientras que

export FOO=bar

permitiría que el subproceso lo encuentre.

Pero si FOOha ya sido definida como una variable de entorno, a continuación, FOO=barmodificará el valor de esa variable de entorno.

Por ejemplo:

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"

Los depósitos más antiguos no admitían la export FOO=barsintaxis; Tuviste que escribir FOO=bar; export FOO.

Mike McQuaid
fuente
33
En realidad, si no usa " export", no está definiendo una variable de entorno, sino solo una variable de shell. Las variables de shell solo están disponibles para el proceso de shell; Las variables de entorno están disponibles para cualquier proceso posterior, no solo shells. Además, los subshells son comandos contenidos entre paréntesis, que tienen acceso a las variables de shell, mientras que de lo que estás hablando son procesos secundarios que resultan ser shells.
wfaulk
¿Dónde se almacenan estos?
HDave
28

Si no usa export, no está definiendo una variable de entorno; solo una variable de shell.

Las variables de shell solo están disponibles para el proceso de shell; Las variables de entorno están disponibles para cualquier proceso posterior, no solo shells.

wfaulk
fuente
2

Además, si desea tener la variable disponible para el shell de llamada sin usar exportar, puede hacer esto:

El archivo a.ksh es -

#!/bin/ksh
FOO=bar

En el indicador, ejecute esto es

> . a.ksh

Esto ejecutará los comandos dentro del mismo shell y $ FOO estará disponible.

Mientras,

> a.ksh

Hará que $ FOO esté disponible solo dentro de a.ksh, después de la llamada a a.ksh no existiría.

alok
fuente
1
Correcto. Tenga en cuenta que "." es solo un atajo para "fuente", que a veces se usa en scripts para una mejor legibilidad. Ver "ayuda". o "fuente de ayuda" para más detalles.
sleske
1

Además de lo que ya se ha respondido, ambas afirmaciones no definen necesariamente (es decir, crear frente a establecer) una variable de entorno, ya que "a" ya podría existir como un shell o variable de entorno.

En el último caso, ambas declaraciones son estrictamente equivalentes.

jlliagre
fuente