2016-09-05 3 views
1

나는 배쉬를 배우고있다. 나의 현재 이해에서, 나는 서브 셸에서 그것을 사용하는 함수를 내보낼 필요가있다. 그러나 하위 셸에서 내보낼 수없는 함수를 호출 할 수 있습니다. 왜 또는 어떻게 수출되지 않은 함수가 하위 셸에서 작동하는지 알고 싶습니다. 테스트 코드는 다음입니다하위 셸에서 내보낼 수없는 함수를 호출 할 수있는 이유는 무엇입니까?

파일 이름 : level1.sh

#!/bin/bash 
function level_1_func { 
    echo "function 1: $1, PID=${BASHPID}" 
} 

파일 이름 : "배쉬의 level0.sh

#!/bin/bash 
# *** If you don't load level1.sh before this function or script, 
# *** level_1_func in this function causes an error of "command not found" 
function level0_func { 
    echo "function 0: $1, PID=${BASHPID}" 
    level_1_func "inside level0_func" 
} 

top.sh

source "./level0.sh" 

# *** Error in level0_func : "level_1_func: command not found." 
# *** It is because level1.sh has not been loaded. 
level0_func "in the current shell" 

# *** Here it loads level1.sh. After this lines, 
# *** it can call level_1_func even in sub-shell. 
# *** (definition of function is exported automatically?) 
source "./level1.sh" 

out_puts="$(level0_func "in the sub shell")" 
echo "${out_puts}" 

출력 top.sh "다음을 참조하십시오

function 0: in the current shell, PID=7575 
./level0.sh: line 7: level_1_func: command not found 
function 0: in the sub shell, PID=7577 
function 1: inside level0_func, PID=7577 

답변

1

이것은 기능과 관련이있는 것이 아니라 셸 옵션과 로컬 변수까지 포함하여 환경에있는 다른 모든 것들을 포함합니다. 예를 들어

:

3.2: ~$ set -o nounset 
3.2: ~$ echo $(set -o|grep nounset) 
nounset on 
3.2: ~$ bash -c 'set -o|grep nounset' 
nounset   off 

용어 "서브 셀"과도 종종 부정확하다 :

3.2: ~$ foo=42 
3.2: ~$ set|grep foo 
foo=42 
3.2: ~$ echo $(set|grep foo) 
foo=42 
3.2: ~$ bash -c set|grep foo 
3.2: ~$        

여기서 쉘 옵션을 사용하는 예이다. "진짜"하위 쉘을 만들면 bash가 현재 프로세스의 복사본을 만듭니다. 따라서 모든 것이 복사됩니다 (fork 액션). 새 프로세스를 만들면 기본적으로 환경 블록에없는 항목 (예 : exec 유형 작업)이 삭제됩니다. 즉, 다른 것들도 사용자 및 그룹 ID, 현재 디렉토리 등과 같은 원래 프로세스에서 유지됩니다.).

+1

답변 해 주셔서 감사합니다. 나는 당신이 말하는 것처럼 하위 쉘, 포크 유형 및 exec 유형의 두 가지 유형을 구별하는 것이 더 낫다는 것에 동의합니다. 그들은 훨씬 더 명확합니다. – mora

+0

하위 쉘이'fork' 액션이라고 말할 수 있습니다. 'fork/exec' 액션은 다른 프로그램을 실행하는 것입니다. 그것은 자식 프로세스이지만 쉘이 아닐 수도 있습니다. – cdarke

4

서브 쉘은 명령 대체에 의해 호출되었지만이 서브 쉘은 현재 쉘과 동일한 컨텍스트를 갖습니다. 새로운 컨텍스트를 생성하려면 명시 적으로 bash을 호출해야합니다.

out_puts="$(bash -c level0_func level0_func "in the sub shell")" 
+0

감사합니다. 나는 bash 매뉴얼에서 "문맥"의 지시를 찾으려고 노력했다. 그러나 나는 그것을 발견 할 수 없었다. 내가 그 지시를 어디에서 얻을 수 있는지 말해 줄 수 있니? – mora

+0

그 이름으로 공식적인 구성이 없다고 생각합니다. 단순히 bash 프로세스의 모든 내부 구조를 나타냅니다. –

+0

다시 한번 감사드립니다. 나는 bash 매뉴얼에서 문장을 찾았습니다 : "서브 쉘이 자동으로 내장 쉘에 -f 옵션으로 정의되도록 함수를 익스포트 할 수 있습니다." 문장의 하위 셸은 예제에서 명시 적으로 생성 된 셸을 의미하지만 명령 대체로 생성 된 셸은 아니라고 가정합니다. 하위 셸로 함수를 내보내는 데 필요한 유일한 경우입니까? – mora

관련 문제