2016-09-14 2 views
0

env 및 start.env는 모든 셸에서 실행해야합니다. 실제로 KORN을 제외하고는 env 변수 설정이 예상대로 작동하지 않습니다. 예를보십시오.korn 셸 및 환경 변수

파일 set.env :

#!/bin/bash 
export MY_VAR="home" || setenv MY_VAR "home" 

파일 start.sh :

#!/bin/bash 
command . ./set.env || source set.env 
echo "$MY_VAR" 

내가 변수의 인쇄를 볼 수 있습니다. ksh에서 터미널에 에코하려고하면 정의되지 않은 상태가됩니다.

내 세션에서 $ MY_VAR이 (가) 표시됩니다. 어떤 아이디어가 있습니까? // 빨간 모자로 실행

+0

'setenv'는 csh입니다. 완전하게 비 POSIX 호환 쉘을 지원해야합니까, 아니면 POSIX sh (대쉬, 애쉬, & c), ksh 및 bash 충분합니까? –

+0

BTW, 어떤 ksh를 사용하고 계십니까? 예를 들어 mksh 인 경우 David-Korn이 작성한 실제 ksh가 아닙니다. –

답변

4

start.sh을 실행하면이를 소싱하지 않고 하위 명령으로 실행합니다. 결과적으로, 환경 변수에 대한 변경은 해당 프로세스와 그 하위에 적용됩니다. 일단 프로세스가 종료되면 설정 한 환경 변수가 함께 종료됩니다. 적은 이식,

# this works on any POSIX shell, including ksh (and bastardizations such as mksh) 
. start.sh 

... 나 :

이식성 현재 쉘을 실행하고, 따라서 그 쉘에서 환경 변수를 설정, 스크립트를 소스로 실행

# this is a bashism 
source start.sh 

실제로 연습으로, command . ./set.env은 이상합니다. command은 쉘 기능의 실행을 막지 만, .이라는 함수가 정의 된 환경은 틀림없이 버그가있는 환경입니다. . start.sh 만 고려하십시오.

+0

'source'는 원래 Bash에 가져온 C-shell-ism입니다. –

+0

$ start.sh 대신 을 이해했습니다. $이어야합니다. start.sh. 은 start.sh에서 "source"하고 싶은 env 파일과 혼동을 불러 일으켰습니다. start.sh 변수에서 "source set.evn"을 호출하면 start.sh의 컨텍스트에서도 볼 수 없습니다. – magulla

+1

'. 모든 POSIX 셸에 이식하기를 원한다면'source set.env'가 아닌'set.env'를 사용하십시오. –