У чому різниця між set
, env
, declare
і export
при установці змінної в Linux оболонки, такі як bash
?
У чому різниця між set
, env
, declare
і export
при установці змінної в Linux оболонки, такі як bash
?
Відповіді:
Здається, що встановити та оголосити дещо відрізняються, набір є більш потужним.
Див. "Оголосити" під https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins декларувати: "Оголосити змінні та надати їм атрибути. Якщо імена не вказано, то відобразимо значення змінних замість цього.
Встановити "встановити" під https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin * set: "Цей вбудований настільки складний, що він заслуговує на власний розділ. Набір дозволяє вам змінити значення параметрів оболонки та встановити позиційні параметри, або відобразити імена та значення змінних оболонок. "
ENV - змінна середовища в Bash: https://www.gnu.org/software/bash/manual/bash.html#Bash-Variables env - це команда Linux. Я думаю, що це хороша довідка: /unix/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 * експорт (від 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 ~#
declare
і set
і env
? експортувати проти декларувати?
По-перше, ви повинні це зрозуміти, environment variables
і shell variables
це не одне і те ж.
Потім, ви повинні знати, що оболонки мають атрибути, які регулюють, як це працює. Ці атрибути не є середовищем, ані змінними оболонки.
Тепер, щоб відповісти на ваше запитання.
env
: без жодних параметрів показує поточні змінні середовища з їх значеннями; Однак можна використовувати для встановлення змінної середовища для однієї команди з -i
прапоромset
: без параметрів ім'я та значення кожної змінної оболонки відображаються * ~ від запуску man set
в rhel; може також використовуватися для встановлення атрибута оболонки . Ця команда НЕ встановлює середовища та змінну оболонки .declare
: без жодних варіантів, те саме, що env
; може також використовуватися для встановлення змінної оболонкиexport
: робить змінні оболонки змінними середовищаКоротко:
set
не встановлює змінних оболонки та середовищаenv
може встановити змінні середовища для однієї командиdeclare
встановлює змінні оболонкиexport
робить змінні середовища оболонки зміннимиПРИМІТКА
declare -x VAR=VAL
створює змінну оболонки, а також експортує її, роблячи її середовищем змінною.
declare -g
цього приводу зробить глобальну змінну, чи це також буде частиною навколишнього середовища?
global scope
ефект, ви можете спробувати створити функцію, яка це робить declare -g a=3
. Як тільки ви запускаєте це, оскільки змінна є загальновиробничою, навіть після того, як ви вийшли з функції, змінна все ще існує (наприклад, ви можете посилатися на неї за допомогою echo $ a)