14

В чем разница между set , env , declare и export при установке переменной в оболочке Linux, такой как bash?

2 ответа2

5

Кажется, что набор и объявление немного отличаются, причем набор более мощный.

См. "Объявить" в https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins Declare: «Объявить переменные и дать им атрибуты. Если имена не указаны, вместо этого выведите значения переменных.

Установите "set" в https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin * set: «Это встроено настолько сложно, что оно заслуживает отдельного раздела. Set позволяет вам изменить значения параметров оболочки и установить позиционные параметры или отобразить имена и значения переменных оболочки. "

ENV - это переменная среды в Bash:https://www.gnu.org/software/bash/manual/bash.html#Bash-Variables env - это команда Linux. Я думаю, что это хорошая ссылка:https://unix.stackexchange.com/questions/103467/what-is-env-command-doing

Я думал, что это хорошее объяснение экспорта:http://www.unix.com/302531838-post2.html

Также: https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins * export (из Bourne): «Отметьте каждое имя, которое будет передано дочерним процессам в среде».

Заимствование кода из URL выше:

root@linux ~# x=5                <= here variable is set without export command
root@linux ~# echo $x
5
root@linux ~# bash               <= subshell creation
root@linux ~# echo $x            <= subshell doesnt know $x variable value
root@linux ~# exit               <= exit from subshell
exit
root@linux ~# echo $x            <= parent shell still knows $x variable
5
root@linux ~# export x=5         <= specify $x variable value using export command
root@linux ~# echo $x            <= parent shell doesn't see any difference from the first declaration
5
root@linux ~# bash               <= create subshell again
root@linux ~# echo $x            <= now the subshell knows $x variable value
5
root@linux ~#
0

Во-первых, вы должны понимать, что environment variables shell variables - это не одно и то же.

Затем вы должны знать, что у оболочек есть атрибуты, которые определяют, как они работают. Эти атрибуты не являются ни средой, ни переменными оболочки.

Теперь перейдем к ответу на ваш вопрос.

  1. env: без параметров показывает текущие переменные среды с их значениями; Однако может использоваться для установки переменной среды для одной команды с флагом -i
  2. set: без параметров, имя и значение каждой переменной оболочки отображаются * ~ из run man set в rhel; также может использоваться для установки атрибута оболочки. Эта команда НЕ устанавливает окружение или переменную оболочки.
  3. declare: без каких-либо опций, так же, как env ; также может использоваться для установки переменной оболочки
  4. export: делает переменные оболочки переменными среды

Короче:

  1. set не устанавливает shell или переменные окружения
  2. env может устанавливать переменные окружения для одной команды
  3. declare наборы переменных оболочки
  4. export делает переменные оболочки переменными среды

ЗАМЕЧАНИЕ declare -x VAR=VAL создает переменную оболочки, а также экспортирует ее, делая ее переменной среды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .