2012-06-18 7 views
9

a.sh쉘 스크립트를 통해 변수를 어떻게 내 보냅니 까?

#! /bin/sh 
export x=/usr/local 

우리는 명령 줄에서 source ./a을 할 수 있습니다. 하지만 쉘 스크립트를 통해 내보내기를 수행해야합니다. 명령 줄에서

b.sh

#! /bin/sh 
. ~/a.sh 

오류없이 ...하지만 $x 아무것도 표시되지 않습니다. 그래서 수출을 얻지 못했습니다.

어떻게 만들 수 있습니까? 자식 쉘의


쉘 스크립트는 자식 쉘 프로세스에서 실행되기 때문에 당신은 쉘 스크립트를 통해 수출을 할 수 없습니다

#! /bin/sh 
export x=/usr/local 
----------- 
[email protected]: ./a.sh 
[email protected]: echo $x 

[email protected]: <insert ....> 
+0

관련 : http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip#176788 – lesmana

답변

17

a.sh, 오직 아이들은 상속 것 수출.

소스를 사용하는 이유는 현재 쉘은 bash는 다른 쉘의 시작 (또는 유사한 파일에 소스 것이다 .bashrc와 같이 파일에 수출 명령을 배치하는 것은 매우 흔한 명령

을 실행하는 것입니다

)

또 다른 아이디어는 당신이 출력의로 수출 명령을 생성하는 쉘 스크립트를 만들 수 있다는 것입니다 :

shell$ cat > script.sh 
#!/bin/sh 
echo export foo=bar 
^D 
chmod u+x script.sh 

을 그리고 현재 쉘이 그 출력을 실행해야

shell$ `./script.sh` 

shell$ echo $foo 
bar 

shell$ /bin/sh 
$ echo $foo 
bar 

은 환경 변수를 내보내기

+0

감사합니다. '^ D' 란 무엇입니까? – CppLearner

+0

ctrl-D를 입력 한 다음 cat을 사용하여 작성중인 파일 쓰기를 마치려면 돌아 가기 –

+0

감사합니다. 내 게시물을 업데이트했습니다. 나는 시도했다. 그러나 내가 그것을 인쇄 할 때 jsut는 나에게 빈 줄을 줬다. 아무 일도하지? – CppLearner

1

(셸은 스크립트의 출력을 실행 원인 스크립트 호출이 역 따옴표 의해 포위되는 상기 주)에만 해당 가변 표시하게 자식 프로세스. 자녀가 부모의 환경을 수정할 수있는 방법은 없습니다.

source a.sh 

을 난이 도움이되기를 바랍니다 :

+0

알려 줘서 고마워, 마크. – CppLearner

31

당신은 현재 프로세스에서 실행 에 '소스'명령을 사용하여 다음 쉘 스크립트에 수출 문을 넣을 수 있습니다.

+4

짧고 명확하고 올바르게. –

+2

이 답변은 tick이 표시되어야합니다 – chicharito

+2

이 답변에는 tick +1이 있어야합니다. – iownthegame

0

(위의 아이디어를 도용/설명하기 위해) 또 다른 방법은 ~/bin에 스크립트를 넣고 ~/bin이 PATH에 있는지 확인하는 것입니다. 그런 다음 전역 변수에 액세스 할 수 있습니다.이것은 현재 소스 디렉토리를 가리 키기 위해 GOPATH 변수가 필요한 Go 소스 코드를 컴파일하는 데 사용하는 예입니다 (소스 코드를 컴파일해야하는 디렉토리에 있다고 가정).

~/bin/GOPATH :

#!/bin/bash 

echo declare -x GOPATH=$(pwd) 

은 그럼 그냥 수행

#> $(GOPATH) 

그래서 지금 너무 다른 스크립트 내에서 $ (GOPATH)를 사용할 수 있습니다, 맞춤형 자동으로이 변수를 호출 할 수있는 스크립트를 구축하고로 $ (pwd) 덕택에 그것을 즉시 선언하십시오.

관련 문제