Різниця між "a = b" і "експортом a = b" в bash


50

Яка різниця між:

a=b

і

export a=b

В баш?

Я розумію, що вони обидва визначають змінні середовища, але я не повністю розумію різницю.


Може хтось, будь ласка, відредагував це? Це зовсім не пов’язано з Linux, але залежить лише від оболонки, яку ви використовуєте. Я думаю, що це баш тут, який також працює в Windows.
innaM

Я стою виправлений.
Адам Матан

Відповіді:


54

export поширює змінну на підпроцеси.

Наприклад, якщо ви зробили це

FOO=bar

тоді підпроцес, який перевіряється на FOO, не знайде змінну, тоді як

export FOO=bar

дозволить підпроцесу знайти його.

Але якщо FOOвона вже була визначена як змінна середовище, тоді FOO=barбуде змінено значення цієї змінної середовища.

Наприклад:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Старіші оболонки не підтримували export FOO=barсинтаксис; треба було писати FOO=bar; export FOO.


33
Насправді, якщо ви не використовуєте " export", ви не визначаєте змінну середовища, а просто змінну оболонки. Змінні оболонки доступні лише для процесу оболонки; змінні середовища доступні для будь-якого наступного процесу, а не лише оболонок. Крім того, доподібні оболонки - це команди, що містяться в дужках, які мають доступ до змінних оболонок, тоді як, про що ви говорите, - це дочірні процеси, які бувають оболонками.
wfaulk

Де вони зберігаються?
HDave

28

Якщо ви не використовуєте export, ви не визначаєте змінну середовища; просто змінна оболонка.

Змінні оболонки доступні лише для процесу оболонки; змінні середовища доступні для будь-якого наступного процесу, а не лише оболонок.


2

Крім того, якщо ви хочете мати змінну доступною для оболонки виклику без використання експорту, ви можете зробити це:

Файл a.ksh є -

#!/bin/ksh
FOO=bar

У відповідь на запит запустіть це

> . a.ksh

Це запустить команди в одній оболонці, і $ FOO буде доступний.

Беручи до уваги,

> a.ksh

Зробить $ FOO доступним лише в межах a.ksh, після виклику a.ksh його не буде.


1
Правильно. Зауважте, що "." - це лише ярлик для "джерела", який іноді використовується в сценаріях для кращої читабельності. Див. "Допомогу". або "джерело довідки" для отримання детальної інформації.
sleske

1

На додаток до того, на що вже відповіли, обидва ці твердження не обов'язково визначають (тобто створюють проти набору) змінну середовища, оскільки "a" може вже існувати як оболонка або змінна середовища.

В останньому випадку обидва твердження є абсолютно рівнозначними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.