¿Qué hacen los bash-builtins 'set' y 'export'?

46

Estoy en un poco de una pérdida en cuanto a la finalidad de sety exporten Bash (y supongo que probablemente otros proyectiles también).

Creo que es para establecer variables de entorno, pero eso se puede hacer solo con VARIABLE=VALUE, ¿verdad?

También escribiendo sety exportpor sí mismos muestran diferentes valores.

Entonces, ¿cuál es su propósito?

mydoghasworms
fuente
Siempre comienzo por bash script con los siguientes dos. #! / usr / bin / env bash set -euxo pipefail Este enlace explica muy bien lo mismo. coderwall.com/p/fkfaqq/…
147.3k

Respuestas:

50

exportexporta a los hijos del proceso actual, por defecto no se exportan. Por ejemplo:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

set, por otro lado, establece atributos de shell, por ejemplo, los parámetros posicionales.

$ set foo=baz
$ echo "$1"
foo=baz

Tenga en cuenta que bazno está asignado a foo, simplemente se convierte en un parámetro posicional literal. Hay muchas otras cosas que setpuede hacer (principalmente opciones de shell), vea help set.

En cuanto a la impresión, la exportllamada sin argumentos imprime todas las variables en el entorno del shell. settambién imprime variables que no se exportan. También puede exportar algunos otros objetos (aunque debe tener en cuenta que esto no es portátil), vea help export.

Chris Down
fuente
Gracias, esa es una respuesta muy útil. Sin embargo, cuando configuro http_proxy solo con http_proxy = abc.com , es visible para los procesos secundarios, por ejemplo, ejecutar wget sin que yo lo exporte. ¿Cómo puede ser esto?
mydoghasworms
2
@mydoghasworms Dos posibles razones. Uno, está ejecutando el comando como foo=bar command. Esta es una exportación implícita para un solo comando. La segunda posibilidad es que http_proxyya se haya exportado a su entorno antes de modificarlo.
Chris Down
Ah sí, tienes razón. Brillante, gracias!
mydoghasworms
6

Ver help set: set se usa para establecer atributos de shell y atributos posicionales.

Las variables que no se exportan no son heredadas por los procesos secundarios. exportse utiliza para marcar una variable para exportar.

choroba
fuente