for 루프의 쉘 변수 값은 루프 이후에 다릅니다.

for 루프의 쉘 변수 값은 루프 이후에 다릅니다.

for 루프에서 변수 값이 변경되고 for 루프 후에 tee를 사용하여 해당 변수의 값을 변경하는 문제를 발견했습니다.

SCRIPT_1:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done 
    echo "STATUS=$STATUS"

script_1의 출력은 다음과 같습니다.

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=5

SRIPT_2:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done | tee /tmp/ses.txt
    echo "STATUS=$STATUS"

출력_2는 다음과 같습니다.

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=9

명령을 완료한 후 tee를 사용할 때 출력이 다른 이유는 무엇입니까?

답변1

"| tee"를 입력하면 스크립트를 해석하는 쉘이 루프에 대한 새 쉘을 포크합니다. 루프에 절전 모드를 삽입하고 백그라운드에서 스크립트를 시작하면 다음과 같은 프로세스 목록이 제공됩니다.

   PID TTY       TIME COMMAND
 21168 pts/0     0:00 sh
 21259 pts/0     0:00 ps
 11962 pts/0     0:00 sh
 21170 pts/0     0:00 sleep
 21171 pts/0     0:00 tee
 21169 pts/0     0:00 sh

보시다시피 목록 끝에 추가 쉘이 있습니다. 이 스크립트를 사용하여 동일한 결과를 얻을 수 있습니다.

STATUS=9
echo "" > /tmp/ses.txt
for  SESSION in  A B C
do
   STATUS=5
   echo "SESSION=$SESSION  STATUS=$STATUS" | tee -a /tmp/ses.txt
done
echo "STATUS=$STATUS"

하지만 말씀하신 부작용은 없습니다.

관련 정보