쉘 스크립트의 전역 환경 변수


83

bash 스크립트에서 전역 환경 변수를 설정하는 방법은 무엇입니까?

내가 같은 일을하면

#!/bin/bash
FOO=bar

...또는

#!/bin/bash
export FOO=bar

... vars는 로컬 컨텍스트에 머무르는 것처럼 보이지만 스크립트 실행이 완료된 후에도 계속 사용하고 싶습니다.

답변:


141

다음으로 스크립트 실행 .

. myscript.sh

현재 셸 환경에서 스크립트를 실행합니다.

export 새 프로세스에서 사용할 수있는 변수를 제어하므로

FOO=1
export BAR=2
./runScript.sh

한 다음 $BAR의 환경에서 사용할 수 runScript.sh있지만 $FOO하지 않습니다.


27
첫 번째 것은 조심하세요. 슬래시가 없으면 경로에 표시됩니다. '. ./myscript.sh '가 특정 항목을 실행하는지 확인하려면.
paxdiablo

13
source의 별칭입니다 .. 따라서 source myscript.sh좀 더 명확하게하고 싶다면 대신 실행할 수 있습니다 .
Ehtesh Choudhury

점과 공백이있는 스크립트를 실행하면 어떻게되는지 궁금합니다. 예 . myscript
cNgamba

54

셸 스크립트 를 실행 하면 하위 셸에서 수행되므로 부모 셸의 환경에 영향을주지 않습니다. 다음을 수행하여 스크립트를 소싱하려고합니다.

. ./setfoo.sh

이것은 서브 쉘이 아닌 현재 쉘 의 컨텍스트에서 실행됩니다 .

bash man 페이지에서 :

. 파일 이름 [인수]
소스 파일 이름 [인수]

현재 셸 환경의 파일 이름에서 명령을 읽고 실행하고 파일 이름에서 마지막으로 실행 된 명령의 종료 상태를 반환합니다.

filename에 슬래시가 없으면 PATH의 파일 이름을 사용하여 파일 이름이 포함 된 디렉토리를 찾습니다.

PATH에서 검색된 파일은 실행 가능할 필요가 없습니다. bash가 POSIX 모드가 아닌 경우 PATH에 파일이 없으면 현재 디렉토리가 검색됩니다.

shopt builtin 명령에 대한 sourcepath 옵션이 꺼져 있으면 PATH가 검색되지 않습니다.

인수가 제공되면 파일 이름이 실행될 때 위치 매개 변수가됩니다.

그렇지 않으면 위치 매개 변수가 변경되지 않습니다. 반환 상태는 스크립트 내에서 종료 된 마지막 명령의 상태 (명령이 실행되지 않은 경우 0)이고 파일 이름을 찾을 수 없거나 읽을 수 없으면 false입니다.


흥미 롭습니다. 전에는 그 구문을 본 적이 없습니다. 소스 ./setfoo.sh와 동일합니까?
ire_and_curses

2
똑같고 입력하는 것이 더 빠릅니다 (그리고 이전 시스템에서 더 호환됩니다-ksh에는 소스 명령이 없지만 '.'가 있습니다).
paxdiablo

9

source myscript.sh 또한 가능합니다.

Linux 명령에 대한 설명 source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

여기에 좀 더 자세한 내용이 있습니다. 무엇에 대한 아주 간단한 설명은 어떻 source습니까?
Phillip Cloud

@PhillipCloud를 man source터미널에 입력 하면 원하는 것을 얻을 수 있습니다.
CDT 2013 년

5
나는 source. OP가 아닐 수도 있습니다.
Phillip Cloud

2
@PhillipCloud 좀 더 자세한 내용을 원합니다. 답을 편집하고 싶다면 확실히 그렇게 할 수 있습니다. 원인과 모든 것을 도와주세요 ... Thx!
Dan Rosenstark 2014

4
#!/bin/bash
export FOO=bar

또는

#!/bin/bash
FOO=bar
export FOO

남자 수출 :

쉘은 지정된 이름에 해당하는 변수에 내보내기 속성을 제공해야하며, 이로 인해 이후에 실행되는 명령의 환경에있게됩니다. 변수 이름 뒤에 = 단어가 오면 해당 변수의 값은 단어로 설정됩니다.


쉘 스크립팅의 모든 초보자에게주의하십시오. envvar 이름, '='문자 및 값 자체 사이에는 공백이 없습니다. 이것은 작동하지 않을 것입니다 :export FOO = /mydir/bar
russellhoff

-3
FOO=bar
export FOO

2
이것은 작동하지 않으며 부모 프로세스에 대한 환경 변수를 설정하지 않습니다.
dreamlax

3
상위 프로세스 만 상위 프로세스에 대한 환경 변수를 설정할 수 있습니다.
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.