Что делают bash-buildins 'set' и 'export'?

46

Я немного растерялся относительно цели setи exportв Bash (и я думаю, что, вероятно, и другие оболочки).

Я думаю, что это для установки переменных среды, но это можно сделать только с помощью VARIABLE=VALUE, верно?

Также печатать setи exportсамостоятельно показывать разные значения.

Так какова их цель?

mydoghasworms
источник
см. также: unix.stackexchange.com/questions/3507/…
lesmana
Я всегда начинаю с bash-скрипта со следующих двух. #! / usr / bin / env bash set -euxo pipefail Эта ссылка прекрасно объясняет то же самое. coderwall.com/p/fkfaqq/…
147,3 тыс.

Ответы:

50

exportэкспортирует в дочерние элементы текущего процесса, по умолчанию они не экспортируются. Например:

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

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

setс другой стороны, устанавливает атрибуты оболочки, например, позиционные параметры.

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

Обратите внимание, что bazэто не присваивается foo, оно просто становится буквальным позиционным параметром. Есть много других вещей, которые setможно сделать (в основном опции оболочки), смотрите help set.

Что касается печати, то exportбез вызова аргументов печатаются все переменные в среде оболочки. setтакже печатает переменные, которые не экспортируются. Он также может экспортировать некоторые другие объекты (хотя вы должны заметить, что это не переносимо), смотрите help export.

Крис Даун
источник
Спасибо, это очень полезный ответ. Тем не менее, когда я устанавливаю http_proxy только с http_proxy = abc.com , он виден дочерним процессам, например, запускает wget без моего экспорта. Как это может быть?
mydoghasworms
2
@mydoghasworms Две возможные причины. Во-первых, вы запускаете команду как foo=bar command. Это неявный экспорт для одной команды. Вторая возможность заключается в том, что http_proxyона уже экспортирована в вашу среду до того, как вы ее измените.
Крис Даун
Ах да, вы правы. Отлично, спасибо!
mydoghasworms
6

Смотрите help set: set используется для установки атрибутов оболочки и позиционных атрибутов.

Переменные, которые не экспортируются, не наследуются дочерними процессами. exportиспользуется для обозначения переменной для экспорта.

choroba
источник