ZaLinux.ru

В чем разница между командами source и export (РЕШЕНО)

Я пишу сценарий оболочки, чтобы прочитать файл с парой ключ=значение и установить эти переменные как переменные среды. Но у меня есть сомнения, если я сделаю source file.txt, установит ли переменные, определённые в этом файле, как переменную среды, или я должен прочитать файл построчно и установить его с помощью команды экспорта?

В этом случае команда source отличается от команды export?

Когда вы делаете source файла, назначения будут установлены, но переменные не будут экспортированы, если не установлена опция allexport. Если вы хотите, чтобы все переменные были экспортированы, гораздо проще использовать allexport и source файла, чем читать файл и явно использовать export. Другими словами, вам следует сделать:

set -a
. file.txt

Я предпочитаю . потому что он более переносимый, чем source, но source отлично работает в bash.

Обратите внимание, что экспорт переменной не делает её переменной среды. Он только делает её переменной среды для подоболочек.

source (.) или export

Самое главное:

  1. source some_script.sh или его POSIX-совместимый эквивалент . some_script.sh, переносит переменные из других скриптов, а
  2. export my_var="something" выталкивает переменные в другие сценарии/процессы, которые вызываются/запускаются из текущего сценария/процесса.

Используя source some_script.sh или . some_script.sh в сценарии оболочки Linux похоже на использование import some_module в Python или #include <some_header_file.h> в C или C++. Он вводит переменные из исходного скрипта.

Использование export some_var="something" похоже на установку этой переменной локально, поэтому она доступна для остальной части текущего скрипта или процесса, а затем также передаётся во все подпрограммы или процессы, которые вы можете вызывать из указать далее.

Подробнее

Итак, рассмотрим следующее:

# экспортируем `some_var`, чтобы она была установлена и доступна в текущем скрипте/процессе,
# а также во всех подпрограммах или процессах, которые вызываются из
# текущего скрипта/процесса
export some_var="something"
# вызов других скриптов/процессов, автоматически передавая им `some_var`
# поскольку она была только что экспортирована выше!
script1.sh # этот скрипт теперь получает прямой доступ к `some_var`
script2.sh # как и этот
script3.sh # и этот

а если сделать так:

# установить эту переменную только для текущего скрипта/процесса
some_var="something"
# вызов других скриптов/процессов, передавая им `some_var` **вручную**
# чтобы они тоже могли её использовать
some_var="something" script1.sh # ручная передача `some_var` этому скрипту
some_var="something" script2.sh # ручная передача `some_var` этому скрипту
some_var="something" script3.sh # ручная передача `some_var` этому скрипту

за исключением того, что первая версия выше, где мы вызвали export some_var="something", на самом деле имеет рекурсивную передачу или экспорт переменных в подпроцессы, поэтому, если мы вызываем script1.sh изнутри нашего текущего сценария/процесса, тогда script1.sh будет получить экспортируемые переменные из нашего текущего сценария, и если script1.sh вызывает script5.sh, а script5.sh вызывает script10.sh, то оба этих сценария также автоматически получат экспортируемые переменные. Это отличается от приведённого выше ручного случая, когда только те скрипты, которые явно вызываются с вручную установленными переменными при вызове скриптов, получат их, поэтому подпрограммы НЕ будут автоматически получать какие-либо переменные из своих вызывающих скриптов!

Как «отменить экспорт» переменной:

Обратите внимание, что после того, как вы экспортировали переменную, вызов unset для неё будет «отменять её вызов», например:

# установить и экспортировать some_var, чтобы подпроцессы получали её
export some_var="something"
script1.sh # этот скрипт автоматически получает `some_var`

# unset и un-export `some_var`, чтобы подпроцессы больше не получали её
unset some_var
script1.sh # tэтот скрипт НЕ получает автоматически some_var

В итоге:

  1. source или . Импортирует (берёт из других скриптов)
  2. export экспортирует (устанавливает для других скриптов)
  3. unset отменяет экспорт (удаляет переменную и её значение)

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *