экспортированная переменная не сохраняется после выполнения скрипта


8

Я сталкиваюсь со странной проблемой. У меня виртуальный компьютер с Solaris 11, и я пытаюсь написать несколько скриптов bash.

если на оболочке я наберу:

export TEST=aaa

и впоследствии запустите:

set

Я правильно вижу новую переменную среды с именем TEST, значение которой aaa. Если, однако, я делаю в основном то же самое в сценарии. когда скрипт завершается, я не вижу набор переменных. Чтобы сделать конкретный пример, если в файле test.sh у меня есть:

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
echo 2: $USER
TEST=sss
echo 3:  $TEST
export TEST
echo 4:  $TEST

это печатает:

1:
2: daniele
3: sss
4: sss

и после его выполнения TEST не устанавливается в оболочке. Я что-то пропустил? Я попытался сделать экспорт TEST = sss и отдельную переменную set / export без разницы.

Ответы:


15

export - сделать переменную доступной для дочерних процессов, но не для родительских.

source - запустить скрипт в оболочке, не создавая дочерний процесс

Для exalmpe постоянная переменная может быть реализована записью в файл

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
CONFIGFILE=~/test-persistent.vars
if [ -r ${CONFIGFILE} ]; then
  # Read the configfile if it's existing and readable
  source ${CONFIGFILE}
fi
echo 2: $TEST
echo 3: $USER
TEST=sss
echo 4:  $TEST
echo TEST="$TEST"> ${CONFIGFILE}
echo 5:  $TEST

Это тоже не совсем то, чего я хотел достичь, но я понял вашу точку зрения. Спасибо.
Даниэль

5

Чтобы сделать ваши переменные видимыми, вам нужен sourceскрипт, который экспортирует ваши переменные. См man source.


1
скорее всего, нет man-страницы с исходным кодом, и help sourceвместо этого вы хотите использовать bash.
рагу

это работает, если я напрямую вызываю скрипт (то есть, если я получаю скрипт с экспортом из оболочки), но, похоже, он не работает, если я получаю скрипт из другого скрипта.
Даниэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.