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"
하지만 말씀하신 부작용은 없습니다.