2013-07-17 1 views
4

전역 변수의 값을 변경하고 싶습니다. 함수를 정상적으로 실행하면 완벽하게 작동합니다. 하지만 티와 함께 ​​실행할 때가 아닙니다. 화면과 파일에 모두 출력하려면 tee가 필요합니다."tee"를 사용할 때 함수에서 전역 변수 변경?

Te가이 동작을하는 이유는 무엇입니까? Tee 함수를 사용하여 전역 변수를 수정할 수 있습니까?

FCT_main() 
{ 
MY_VAR=2 
} 

MY_VAR=1 

echo "MY_VAR=$MY_VAR" # -> print 1. 
FCT_main | tee file.out 
echo "MY_VAR=$MY_VAR" # -> print 1, but I expect 2 ! 

echo "\n" 

echo "MY_VAR=$MY_VAR" # -> print 1. 
FCT_main 
echo "MY_VAR=$MY_VAR" # -> print 2 as expected. 

답변

4

tee과 관련된 문제는 아닙니다. 그것은 배관 작업입니다. 파이프의 각 명령은 별도의 하위 쉘에서 실행됩니다.

함수의 변수에 대한 변경 사항은 반영되지 않습니다.

다음 프로세스 대체를 수행 할 수 있지만 여전히 파이핑과 동등하지 않습니다.

FCT_main > >(tee file.out) 

: 프로세스 대체는 일부 조개와 함께 작동합니다. 이 코드는 bash 쉘에서 작동하는 것으로 밝혀졌습니다.

FCT_main() 
{ 
MY_VAR=2 
} 

MY_VAR=1 

echo "MY_VAR=$MY_VAR" # -> print 1. 
FCT_main > >(tee file.out) 
echo "MY_VAR=$MY_VAR" # -> print 1, but I expect 2 ! 

echo "\n" 

echo "MY_VAR=$MY_VAR" # -> print 1. 
FCT_main 
echo "MY_VAR=$MY_VAR" # -> print 2 as expected. 
+0

감사합니다. 다른 방법을 시도했지만 구문 오류가 발생했습니다. 'code./test.sh[10] : 10 행의 구문 오류 : ('unexpected' – Sephi

+0

@Sephi 답변에 전체 코드를 추가했습니다. . 복사 복사하여 붙여 넣으십시오. – Antarus

+0

그래, 리눅스에서 잘 작동하지만, 슬프게도 나는 SunOS를 사용하고있다. ( – Sephi

0

같은 문제는 다음 코드에서 발생하는 전체 코드 :

i=0 
cat $file | while read line; do 
    i=$(($i + 1)) 
done 

i 루프의 끝 부분에 0으로한다.

i=0 
while read line; do 
    i=$(($i + 1)) 
done < $file 

실제로 작동합니다. 문제는 파이프 라인에서 사용될 때 while이 서브 쉘에서 실행된다는 것입니다 (이 문제에 대해서는 cat입니다).하지만 표준 입력을 리디렉션 할 때는 문제가되지 않습니다.

실제 코드를 게시하면 특정 스 니펫에 대한 해결책을 도출 할 수 있습니다.