В чем разница между set
, env
, declare
и export
при установке переменной в оболочке Linux, такой как bash
?
2 ответа
Кажется, что набор и объявление немного отличаются, причем набор более мощный.
См. "Объявить" в 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 ~#
Во-первых, вы должны понимать, что environment variables
shell variables
- это не одно и то же.
Затем вы должны знать, что у оболочек есть атрибуты, которые определяют, как они работают. Эти атрибуты не являются ни средой, ни переменными оболочки.
Теперь перейдем к ответу на ваш вопрос.
env
: без параметров показывает текущие переменные среды с их значениями; Однако может использоваться для установки переменной среды для одной команды с флагом-i
set
: без параметров, имя и значение каждой переменной оболочки отображаются * ~ из runman set
в rhel; также может использоваться для установки атрибута оболочки. Эта команда НЕ устанавливает окружение или переменную оболочки.declare
: без каких-либо опций, так же, какenv
; также может использоваться для установки переменной оболочкиexport
: делает переменные оболочки переменными среды
Короче:
set
не устанавливает shell или переменные окруженияenv
может устанавливать переменные окружения для одной командыdeclare
наборы переменных оболочкиexport
делает переменные оболочки переменными среды
ЗАМЕЧАНИЕ declare -x VAR=VAL
создает переменную оболочки, а также экспортирует ее, делая ее переменной среды.