Как изменить PATH в сценарии оболочки?

28

У меня есть несколько проектов, которые требуют от меня изменения версий Java / Grails / Maven. Я пытаюсь справиться с этим с помощью некоторых скриптов, которые внесут изменения. Например:

#!/bin/sh

export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
export PATH=$JAVA_HOME/bin:$PATH
export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3
export PATH=$GRAILS_HOME/bin:$PATH
export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11
export PATH=$MAVEN_HOME/bin:$PATH
which java
which grails
which mvn

Когда это выполняется, он успешно изменяет PATH в контексте сценария, но затем сценарий заканчивается, и никакие изменения не были выполнены.

Как я могу запустить скрипт таким образом, чтобы изменить PATH для оболочки, в которой я сейчас работаю?

Я использую Cygwin.

Эрик Уилсон
источник

Ответы:

39

Вы должны использовать sourceили evalили, чтобы породить новую оболочку.

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

Существует множество различных методов для управления этой ситуацией:

  1. Подготовьте файл исходного файла, содержащий список команд sourceв текущей оболочке:

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH

    а затем источник

    source sourcefile

    обратите внимание, что в начале исходного файла нет необходимости использовать sha-bang , но он будет работать с ним.

  2. Подготовьте скрипт evalfile.sh, который печатает команду для установки среды:

    #!/bin/sh
    echo "export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22"
    echo "export PATH=$JAVA_HOME/bin:$PATH"

    и затем evalиспользуйте его:

    eval `evalfile.sh`
  3. Настройте и запустите новую оболочку:

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash

    обратите внимание, что когда вы наберете exitэту оболочку, вы вернетесь к отцу .

  4. Добавьте псевдоним в ваш ~/.bashrc:

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'

    и при необходимости позвоните:

    prepare_environ
andcoz
источник
1
Я заметил, что sourceработает только для bash. Выход для ksh: /bin/ksh: source: not foundдля sh: sh: 0: source: not found. Ответ ниже должен быть рассмотрен для этих оболочек.
Дэнни Ло
@dannylo, ты прав, но вопрос явно bashцентрированный.
andcoz
Требуется ли «экспорт» с $ PATH - который, по-видимому, уже существует?
ессков
@esskov обычно это не так. Я помню только старую старую версию sh в AIX, которая требовала этого (около 1992 года), но, возможно, это была какая-то ошибка.
andcoz
19

Вы можете сделать это с помощью встроенного исходного кода :

. script_name

Некоторые оболочки предоставляют псевдоним с именем source :

source script_name
Димитр Радулов
источник
-1

Установленный Chocolatey @ unix, вы можете просто запустить RefreshEnv, чтобы получить обновленные переменные среды в текущем сеансе

подробно

小 色狼
источник
1
Вопрос, который вы тоже связали (и его ответы), касается Windows.   Этот вопрос касается Unix и Linux, поэтому ваш пост не отвечает на этот вопрос.
G-Man говорит: «Восстановите Монику»
установлен Chocolatey @ unix
小 色狼
ОК, вы утверждаете, что этот ответ работает для Unix. Ваша подробная ссылка все еще не имеет значения. Пожалуйста, подробно опишите, как это работает в Unix. Ссылки на авторитетные документы были бы хороши, но не размещайте только ссылки; вставьте соответствующую информацию в свой ответ. … Пожалуйста, не отвечайте в комментариях; отредактируйте свой ответ, чтобы сделать его более понятным и полным.
G-Man говорит: «Восстановите Монику»