Яка різниця між 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.