BASH-скрипт для установки недействительных переменных среды

89

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

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

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

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

~$: 

Что случилось? Заранее спасибо. Mirko

    
задан MirkoZa 15.07.2011 в 08:18
источник

4 ответа

124

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

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

source script.sh
echo $BASE

Произведет

/home/develop/trees

Команда . является синонимом для source , который часто встречается в скриптах.

. script.sh     # identical to "source script.sh"
    
ответ дан user21322 15.07.2011 в 08:53
источник
4

Я часто хочу установить переменную среды без проблем.

Вот что я добавляю к своему .bashrc, чтобы реализовать это удобство.

defect() {
    if [  ] && [ -z  ]
    then
        eval 'export DEFECT='
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}
    
ответ дан jlettvin 13.09.2013 в 16:49
3

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

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

. ./script.sh

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

    
ответ дан con-f-use 15.07.2011 в 08:48
0

Вы можете попробовать что-то вроде этого

CURRENT_DIR='pwd'
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
    
ответ дан sector11 11.01.2017 в 10:14