쉘 스크립트에서 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

    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그것을 uate :

    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 foundsh: sh: 0: source: not found. 이 껍질에 대해서는 아래의 대답을 고려해야합니다.
Danny Lo

@dannylo, 당신 말이 맞지만 문제는 분명히 bash중심적입니다.
andcoz

이미 존재하는 $ PATH와 함께 '내보내기'가 필요합니까?
esskov

@esskov는 보통 그렇지 않습니다. 필자는 AIX에서 이전 버전의 sh만을 기억했지만 (1992 년경) 아마도 일종의 버그 일 것입니다.
andcoz

19

소스 내장 을 사용하여이를 수행 할 수 있습니다 .

. script_name

일부 쉘은 source 라는 별명을 제공합니다 .

source script_name

-1

Chocolatey @ unix를 설치하면 RefreshEnv를 실행하여 업데이트 된 환경 변수를 현재 세션으로 가져올 수 있습니다

세부 묘사


1
당신이 연결 한 질문과 그 대답은 Windows에 관한 것입니다.   질문은 Unix & Linux에 관한 것이므로 게시물 에이 질문에 대한 답변 없습니다 .
G-Man, 'Reinstate


이 답변이 유닉스에 효과적이라고 주장합니다. 세부 정보 링크는 여전히 관련이 없습니다. 이것이 유닉스에서 어떻게 작동하는지에 대한 세부 사항을 알려주십시오. 권위있는 문서에 대한 링크는 좋지만 링크 만 게시하지는 마십시오. 관련 정보를 답에 넣으십시오. … 의견에 응답하지 마십시오. 명확하고 완전하게 답변을 편집 하십시오.
G-Man, 'Reinstate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.