누군가 내 while 루프에 내부 범위가 있는 것 같은 이유를 설명해 주시겠습니까? 온라인에서 여러 설명을 보았지만 모두 파이프와 관련이 있습니다. 내 코드에는 아무것도 없습니다.
코드:
#!/bin/sh
while read line
do
echo "File contents: $line"
echo
if [ 1=1 ]; then
test1=bob
fi
echo "While scope:"
echo " test1: $test1"
done < test.txt
if [ 1=1 ]; then
test2=test2;
fi
echo;
echo "Script scope: "
echo " test1: $test1"
echo " test2: $test2"
출력:
File contents: In the file
While scope:
test1: bob
Script scope:
test1:
test2: test2
답변1
Bourne 셸에서 while
루프와 같은 복합 명령을 리디렉션하면 해당 복합 명령이 하위 셸에서 실행됩니다.
Solaris 10 및 이전 버전 1/bin/sh
에서는 Bourne 쉘을 사용하고 싶지 않습니다 . POSIX 를 얻으려면 대신 /usr/xpg4/bin/sh
또는 를 사용하십시오 ./usr/bin/ksh
sh
어떤 이유로 인해 을 사용해야 하는 경우 /bin/sh
다음을 수행하는 대신 해당 문제를 해결하려면 다음을 수행하십시오.
compound-command < file
넌 할 수있어:
exec 3<&0 < file
compound-command
exec <&3 3<&-
그건:
- fd 0을 fd 3에 복제하여 저장한 다음 fd 0을 파일로 리디렉션합니다.
- 명령을 실행
- fd 3에 저장된 복사본에서 fd 0을 복원하고 더 이상 필요하지 않은 fd 3을 닫습니다.
1 . Solaris 11 이상에서 Oracle은 결국 (마지막으로) /bin/sh
POSIX 쉘을 만들었으므로 이제는 sh
대부분의 다른 Unices와 마찬가지로 동작합니다( 다른 Unices와 마찬가지로 sh
POSIX에 기반한 확장을 지원하지만 POSIX에서 지정한 언어를 해석합니다 ksh88
, sh
여기서는 일반적으로 ksh88, pdksh, bash, yash 또는 향상된 ash를 기반으로 함))