Дата и время публикации:
Дата и время модификации:
Определения и сравнения
1. Определения
В командной оболочке SHELL существуют две встроенные команды разным set и export
1.1 Команда export
Встроенная команда export позволяет устанавливать имя переменной в ниже следующих последовательностей команд после её использования, как показано в дампе 1.1
Дамп 1.1.1
... export name=value ...
или функции, как показано в дампе 1.1.2
Дамп 1.1.2
func(){ ... } ... export -f func ...
Для прекращения действия переменной SHELL объявленной командой export в текущей подчиненной последовательности только использование команды unset, как показано в дампе 1.1.3 (для переменной)
Дамп 1.1.3
... # явное прекращение действия переменной name unset -v name
и 1.1.4 (для функции).
Дамп 1.1.4
... # явное прекращение действия функции func unset -f funct
1.2 Команда set
Команда set перечисляет значение всех переменных SHELL, если вызывается без аргументов, как показано в дамп 1.2.1
Дамп 1.2.1
... set [{-option | +option}] [--] shell_args ...
Команда set используется для установки функциональных атрибутов командного интерпретатора. При этом их набор в DASH(1) и BASH(1) может разница, поэтому справляйтесь об их перечне с помощью опции -o, которая выводит весь их доступный перечень.
Соответственно, -option устанавливает атрибут, а +option отменяет его действие . Конец списка опций задается традиционно с [--], а список устанавливаемых агрументов SHELL в shell_args, разделяя их через пробел.
2.Cравнения
2.1. Команда export
Как было уже сказано выше, команда export объявляет переменную от начала (родительского) и до конца, в глубь наследуемых(дочерних) процессов, как показано ниже в дампе 2.1.1
Дамп 2.1.1
$ foo=bar ; export foo; echo $foo; /bin/sh -c 'echo "$foo"' bar bar $_
Соответственно, после выдачи команды exit(1) повторного запуска SHELL, увидим следующее в листинге 2.1.2
Дамп 2.1.2
$ echo $foo; sh -c 'echo "$foo"' $_
2.2. Команда set
В тоже время, команда set, с другой стороны устанавливает атрибуты самой командной оболочки, как например символьно-позиционный параметр (англ. literal positional parameter), как показано в листинге 2.2.1
Дамп 2.2.1
$ set foo=baz foo1=baz1; echo $1; echo $foo foo=baz bar
При этом необходимо помнить, что baz не назначается foo, а является просто символьно-позиционным параметром и не более. Кроме того, как уже было указано выше, команда set перечисляет установленные атрибуты командной облочки (через опции) и символьно-позиционный параметры.
/bin/sh -c 'set -x ; set foo=bar foo1=bar1; echo "$# args: [$0] [$1] [$2]"; set +x'
+ set foo=bar foo1=bar1
+ echo 2 : [/bin/sh] [foo=bar] [foo1=bar1]
2 args: [/bin/sh] [foo=bar] [foo1=bar1]
+ set +x
Как только что было показано, команда set используется для установки отладки и некоего списка параметров, который "загружается" в аргументы командной строки используемого командного интерпретатора. В данном случае используется /bin/sh, имя (или абсолютный) путь которого указан в 0-й позиции списка. При этом в устанавливается опция -x, включающая трассировку интерпретирумых переменных, команд и функций, именуюемую xtrace. Соответственно, опция +x в конце её отключает.
Для получения более подробных сведений об используемых опциях выполните, как показано ниже
$ help set
2.3 Так в чем различие?
А в том, что команды export и set являются двумя диаметрально портивоположными командами, служащих для объявления разного типа:
Первая, команда export оперирует переменными и функциями, в то время как, вторая, команда set устанавливает функциональные атрибуты и символьно-позиционные параметров самой SHELL.
3. Библиография
3.1 What do the bash builtins set and export do?
3.2 Command Set