Мы знаем, что можем изменить переменные окружения bash, например, PATH , используя скрипт инициализации, например .bashrc . Просто напишите PATH=<VALUE> и вы получите то, что хотите.

Но рассмотрим эту проблему:

У нас есть bash-скрипт с именем rc:

#!/bin/bash  

mySite="superUser"
export mySite
echo "the value of mySite is: $mySite"

Затем мы объявляем переменную mySite , выполняем сценарий rc и проверяем значение переменной:

$ declare -x mySite="super"
$ ./rc 
the value of mySite is: superUser
$ echo $mySite
super

Значение по-прежнему super . можем ли мы заключить, что дочерняя оболочка не может изменить переменную родительской оболочки напрямую, используя инструкцию типа VARIALBENAME=VLAUE?

Наш rc скрипт похож на .bashrc , и как мы можем изменить значение переменной окружения bash, поместив в него PATH=<VLAUE> , поскольку, когда выполнение .bashrc закончено, переменная вызывающей оболочки по-прежнему не изменяется ?

1 ответ1

3

Переменные среды наследуются ... и родительские процессы не наследуют ничего от своих дочерних элементов (это работает в другом направлении).

В вашем первом случае процесс bash, читающий rc-файл, - это либо тот же процесс, в котором вы используете переменную, либо ее предок.

Во втором случае процесс чтения файла является дочерним элементом вашей оболочки. Есть 3 способа обойти это:

  1. пусть ваш скрипт запустит новую оболочку, которая наследует переменные. Ваша оригинальная оболочка возобновится (с ее исходной средой), когда вы выйдете
  2. исходный код сценария rc, а не его выполнение:

    . ./rc
    

    или же

    source ./rc
    

    инструктирует вашу текущую оболочку прочитать сам скрипт (а не выполнять его в потомке) и затем продолжить

  3. явно оценивать вывод (как это обычно делается с ssh-agent например)

    eval `./rc`
    

    где RC изменился на

    #!/bin/bash
    echo "export mySite=\"superUser\""
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .