Як змінити 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

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

  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

1
Я помітив, що sourceпрацює лише для bash. Вихід для ksh: /bin/ksh: source: not foundдля sh: sh: 0: source: not found. Відповідь нижче слід враховувати для цих оболонок.
Danny Lo

@dannylo, ви праві, але питання чітко bashорієнтоване.
andcoz

Чи потрібен "експорт" за допомогою $ PATH - який, мабуть, вже існує?
esskov

@esskov зазвичай це не так. Я пам’ятаю лише стару стару версію sh на AIX, яка вимагала цього (близько 1992 р.), Але, напевно, це була якась помилка.
andcoz

19

Ви можете зробити це за допомогою вбудованого джерела :

. script_name

Деякі оболонки містять псевдонім з назвою джерело :

source script_name

-1

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

докладно


1
Питання, з яким ви також пов’язали (і його відповіді), стосується Windows.   Це питання стосується Unix & Linux, тому ваша публікація не відповідає на це запитання.
G-Man каже: "Відновіть Моніку"

встановлено Chocolatey @ unix
1818

Гаразд, ви стверджуєте, що ця відповідь працює для Unix. Ваше посилання на деталі досі не має значення. Будь ласка, надайте детальну інформацію про те, як це працює в Unix. Посилання на авторитетні документи було б добре, але не публікуйте лише посилання; помістіть у відповідь відповідну інформацію. … Будь ласка, не відповідайте на коментарі; відредагуйте свою відповідь, щоб зробити її більш зрозумілою та повною.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.