Скрипт BASH для установки переменных окружения не работает

Я написал следующий сценарий, чтобы при необходимости установить некоторые переменные среды.

#!/bin/shexport BASE=/home/develop/treesecho $BASEexport PATH=$PATH:$BASEecho $PATH

Ниже команда и результаты, которые я вижу на своем терминале: скрипт запускается, но переменные не задаются в конце.

~$: ./script.sh/home/develop/trees/bin:......:/home/develop/trees~$: echo $BASE~$: 

Что не так?Заранее спасибо.Мирко

export экспортирует присвоение переменной дочерним процессам оболочки, в которой выполняется export команда была выполнена. Ваша среда командной строки - это родитель оболочки скрипта, поэтому он не видит присвоение переменной.

Вы можете использовать . (или source) команда bash для выполнения команд скрипта в текущей среде оболочки и достижения желаемого, например

source ./script.shecho "$BASE"

Будет производить

/home/develop/trees

То source команда, часто встречающаяся в скриптах, является синонимом bash для ., который является частью стандарта POSIX (так . доступен, например, в dash, но source это не так).

. ./script.sh     # identical to "source ./script.sh"

(. script.sh и source script.sh будет сначала искать script.sh в PATH, так что безопаснее указать путь к script.sh.)

Когда вы запускаете скрипт, он выполняется в подоболочке. Переменные допустимы только в контексте этой подоболочки. Поместите их в свой .bashrc или .profile и читайте дальше переменные и подоболочки. В export оператор работает по иерархии вниз (текущая оболочка и все ее подоболочки), а не вверх, как в вашем примере.

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

. ./script.sh

Это приводит к тому, что он запускается в вашей текущей оболочке, но также не будет передавать переменные вверх по иерархии.

Я часто хочу установить переменную окружения без лишних хлопот.

Вот что я добавляю в свой файл .bashrc для реализации этого удобства.

defect() {    if [ $1 ] && [ -z $2 ]    then        eval 'export DEFECT=$1'        return 0    else        echo 'Usage: defect {number}'        return 1    fi}

Оболочки открываются иерархически. Вы можете установить переменные родительской оболочки, используя . ./yourscript.sh