내 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 셸에서 복합 명령(예: loop 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 쉘을 만들었으므로 이제는 대부분의 다른 Unices처럼 작동합니다. (다른 Unices와 마찬가지로) 이를 기반으로 하기 때문에 확장을 지원하지만 POSIX 지정 언어를 sh
해석합니다 . 이제 일반적으로 ksh88, pdksh, bash, yash 또는 Enhanced Ash를 기반으로 함))sh
ksh88
sh