Яка різниця між set, env, заявою та експортом при встановленні змінної в оболонці Linux?


Відповіді:


5

Здається, що встановити та оголосити дещо відрізняються, набір є більш потужним.

Див. "Оголосити" під 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? експортувати проти декларувати?
— Pacerier

Мені довелося це спростувати, тому що це просто не відповідає на питання.
— Даніель К. Собрал

Дайте мені знати, чи це краще.
— Шон П.

2

По-перше, ви повинні це зрозуміти, environment variablesі shell variablesце не одне і те ж.

Потім, ви повинні знати, що оболонки мають атрибути, які регулюють, як це працює. Ці атрибути не є середовищем, ані змінними оболонки.

Тепер, щоб відповісти на ваше запитання.

  1. env: без жодних параметрів показує поточні змінні середовища з їх значеннями; Однак можна використовувати для встановлення змінної середовища для однієї команди з -iпрапором
  2. set: без параметрів ім'я та значення кожної змінної оболонки відображаються * ~ від запуску man setв rhel; може також використовуватися для встановлення атрибута оболонки . Ця команда НЕ встановлює середовища та змінну оболонки .
  3. declare: без жодних варіантів, те саме, що env; може також використовуватися для встановлення змінної оболонки
  4. export: робить змінні оболонки змінними середовища

Коротко:

  1. set не встановлює змінних оболонки та середовища
  2. env може встановити змінні середовища для однієї команди
  3. declare встановлює змінні оболонки
  4. export робить змінні середовища оболонки змінними

ПРИМІТКА declare -x VAR=VAL створює змінну оболонки, а також експортує її, роблячи її середовищем змінною.


Що з declare -gцього приводу зробить глобальну змінну, чи це також буде частиною навколишнього середовища?
— Містер Роланд

Це не буде частиною навколишнього середовища. Він стане змінною оболонки, яка має глобальну сферу застосування. Щоб побачити global scopeефект, ви можете спробувати створити функцію, яка це робить declare -g a=3. Як тільки ви запускаєте це, оскільки змінна є загальновиробничою, навіть після того, як ви вийшли з функції, змінна все ще існує (наприклад, ви можете посилатися на неї за допомогою echo $ a)
— Tran Triet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.