Я написал следующий сценарий, чтобы при необходимости установить некоторые переменные среды.
#!/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