2016-09-07 6 views
1

저는 bash에 익숙하지 않았기 때문에 저를 당황하게하는 사례를 만났습니다.Bash. 변수의 가시성과 수명

-------point 1-------- 

-------point 2-------- 
El 1 
El 3 
El 2 
var value 

당신이 볼 수 있듯이, 함수 F1은 두 가지 방법으로 불렸다 그들은 매우 다른 의미를 부여 :

f1() 
{ 
    ar+=(1) 
    ar+=(3) 
    ar+=(2) 
    var="var value" 
    echo "0" 
} 

f2() 
{ 

    res=$(f1) 
    echo -------point 1-------- 
    for i in ${ar[@]}; do 
     echo "El $i" 
    done 
    echo $var 

    echo -------point 2-------- 
    f1>/dev/null 
    for i in ${ar[@]}; do 
     echo "El $i" 
    done 
    echo $var 
} 

f2 

이 스크립트는 다음과 같은 결과를 생성 : 그것은 이러한 경우의 예입니다. 첫 번째 호출에서 f1에 선언 된 배열과 변수는 분명히 파괴되었습니다. 두 번째 방법으로 배열과 변수가 저장되었습니다.

아무도 나에게 설명하거나 적절한 매뉴얼에 대한 링크를 줄 수 있습니까?

답변

4

이 할 때 :

res=$(f1) 

당신은 서브 쉘을 생성 서브 쉘 내부 f1를 실행하고 변수 $res에 출력을 저장합니다. 해당 하위 셸에서 작성된 변수는 닫힌 후에 손실됩니다. 이 작업을 수행 할 때

:

f1>/dev/null 

당신은 현재 쉘에서 f1을 실행합니다. 함수 내에서 생성 된 변수는 전역 범위에 있으므로 이후에 액세스 할 수 있습니다.