Сценарій BASH для встановлення змінних середовища не працює


137

Я написав наступний сценарій, щоб встановити деякі змінні середовища, коли це необхідно.

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

~$: 

Що не так? Заздалегідь спасибі. Мирко

Відповіді:


193

exportекспортує присвоєння змінної дочірніх процесів оболонки, в якій виконувалася exportкоманда. Навколишнє середовище командного рядка є батьківською оболонкою сценарію, тому воно не бачить призначення змінної.

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

source ./script.sh
echo "$BASE"

Вироблять

/home/develop/trees

sourceКоманда, часто бачили в сценаріях, це Баш синонім ., який є частиною стандарту POSIX (так .доступний в тирі, наприклад, але sourceце не так ).

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

( . script.shІ source script.shбуде спочатку шукати script.shв PATH, так що це безпечніше , щоб вказати шлях до script.sh.)


29
Вам не потрібно exportпередавати змінні в допоміжні оболонки, субшалл - це копія вашої поточної оболонки, включаючи змінні та функції і т.д. По-друге, .це команда POSIX для пошуку джерел. Bash додає sourceдля нього більш читабельний синонім, але ви не можете розраховувати на те, що він доступний у ш. Нарешті, . ./scriptзамість того, . scriptякщо ви хочете уникати сюрпризів. mywiki.wooledge.org/BashFAQ/060
geirha

Зауважте, що якщо ви використовуєте джерело сценарію AND, використовуєте "pipe", то джерело джерела не доступне для батьків. наприклад, "джерело setit.sh" добре. 'джерело setit.sh | tee setit.log' не в порядку. Дивно. Не інтуїтивно зрозумілий.
gaoithe

10

Коли ви запускаєте скрипт, він запускається в нижній частині. Змінні дійсні лише в контексті цієї підпакеті. Встановіть їх у своїх .bashrcабо .profileта прочитайте на змінних та підрозділах . exportОператор працює вниз (ієрархію поточної оболонки і всю ця подоболочкі) не вище , як у вашому прикладі.

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

. ./script.sh

Це призводить до запуску у вашій поточній оболонці, але також не передасть змінні в ієрархію.


5

Я часто хочу встановити змінну середовища без клопоту.

Ось що я додаю до свого .bashrc, щоб реалізувати цю зручність.

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

-1

Ви можете спробувати щось подібне

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.