쉘 스크립트에서 환경 변수를 "내 보낸"방법은 무엇입니까?


54

Amazon EC2 계정이 여러 개 $EC2_HOME있는데 스크립트를 사용하여 와 같은 변수를 빠르게 전환하려고합니다 .

다음과 같이 쉘 스크립트를 설정했습니다.

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

스크립트를 실행할 때 EC2_HOME설정된 것으로 알고 있지만 export스크립트가 완료된 후 를 사용 하면 변수 가 계속 사용 된다고 생각했습니다 . 달리기 echo $EC_HOME는 아무것도 표시하지 않기 때문에 그렇지 않습니다.

나는 이것이 매우 기초적인 리눅스 스크립팅 지식이어야한다는 것을 알고 있지만 그것을 모른다. 운없이 관련 질문을 찾아 보았습니다. 이것이 중복되면 사과드립니다.

답변:


60

스크립트를 소싱해야합니다.

. ./script

또는

source ./script

19
그 이유는 스크립트가 현재 쉘의 자식으로 새로운 쉘 프로세스를 생성하기 때문입니다. 하위 프로세스에서 변경 한 환경 은 상위에 영향을 줄 수 없습니다 . 때 사용 .하거나 source새로운 자식 프로세스를 생성하지 않습니다, 당신은 현재 쉘의 명령을 실행하고 있습니다.
glenn jackman

1
@glennjackman 비슷한 문제가 있으며 해결책을 시도했지만 .또는 할 때 쉘에서 로그 오프 source합니다. 왜 이런 일이 발생합니까?
Patryk

7
@Patryk : 스크립트에 exit명령문이 있으므로 소스로 사용하기에 적합하지 않습니다.
enzotib 2012

source ./script잘 작동 하지만 sudo source ./script.sh말한다 sudo: source: command not found. sudo를 사용하여 어떻게 할 수 있습니까?
71GA

1
@ 71GA : 컴파일 환경 설정 sudo및 구성 설정에 따라 /etc/sudoers명령을 실행할 때 환경을 보존하거나 보존 할 수 없습니다 sudo. 스크립트를 소싱 한 다음 환경을 보존하기위한 옵션으로 실행 sudo하는 것이 좋습니다 -E. 작동하지 않으면 할 수있는 일이 거의 없다고 생각합니다.
enzotib

35

스크립트를 실행하면 자체 쉘과 자체 환경이 생겨 스크립트가 완료 되 자마자 다시 사라집니다. 환경 변수를 유지하려면 스크립트를 현재 쉘로 소싱하십시오.

$ source ./a.sh

또는 동등하게 (그러나 조금 더 이식 가능하게) POSIX 도트 명령을 사용하십시오 .

$ . ./a.sh

그런 다음 정의는 현재 셸 환경에 배치되고 사용자가 시작한 모든 프로그램에서 상속됩니다.

스크립트 실행에 더 가까워 . a.sh지려면 PATH환경 변수 에서 디렉토리를 검색하여 a.sh를 찾으십시오 .


이 이러한 행동 방식에 약간의 미묘한, 그리고 여부 .source(전혀 또는 현재) 동일합니다. . ./a.sh확실히 모든 POSIX 호환 쉘에서 동일하게 동작하지만 것입니다 source., 및 . a.sh. ./a.sh다를 수 있습니다. 강타의 경우 source.동일합니다 모든 경우에; 대한 zsh을 source항상 먼저 현재 디렉토리를 확인 ; ksh는 본질적으로 유사합니다.

스크립트 이름이 (로 포함 된 /) 경로로 제공되면 해당 경로는 모든 경우에 직접 사용됩니다. 가장 휴대하기 쉬운 방법은 . ./script또는 . /path/to/script입니다.


1

단지 기록을 위해.

env를 시스템으로 내보내는 인터넷에서 스크립트를 실행하려면

다음 형식을 사용할 수 있습니다

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

예를 들면 다음과 같습니다.

source <(curl -s -L https://example.com/install.sh)

해당 스크립트를 신뢰하면 위험 해 보이지만 유용합니다!
마크 스튜어트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.