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


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

#!/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


103
2017-07-15 08:18


происхождения




ответы:


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

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

source script.sh
echo $BASE

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

/home/develop/trees

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

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

147
2017-07-15 08:53



Вам не нужно export для передачи переменных на подоболочки, подоболочка является копией вашей текущей оболочки, включая переменные и функции и т. д. Экспортируемые переменные копируются в новые процессы, порожденные из оболочки, независимо от того, что этот процесс является другой оболочкой или нет. Во-вторых, . это команда POSIX для поиска. Баш добавляет source как более читаемый синоним для него, но вы не можете полагаться на его доступность в sh. наконец . ./script вместо . script если вы хотите избежать сюрпризов. mywiki.wooledge.org/BashFAQ/060 - geirha
Обратите внимание: если вы используете сценарий и используете канал, то исходная среда недоступна для родителя. например 'source setit.sh' в порядке. 'source setit.sh | tee setit.log' не подходит. Удивительный. Не интуитивно. - gaoithe


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

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

. ./script.sh

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


7
2017-07-15 08:48





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

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

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

4
2017-09-13 16:49





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

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}

-1
2018-01-11 10:14