У чому різниця між 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)