Solaris에서 while-read-loop의 변수 범위

Solaris에서 while-read-loop의 변수 범위

누군가 내 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/kshsh

어떤 이유로 인해 을 사용해야 하는 경우 /bin/sh다음을 수행하는 대신 해당 문제를 해결하려면 다음을 수행하십시오.

compound-command < file

넌 할 수있어:

exec 3<&0 < file
compound-command
exec <&3 3<&-

그건:

  1. fd 0을 fd 3에 복제하여 저장한 다음 fd 0을 파일로 리디렉션합니다.
  2. 명령을 실행
  3. fd 3에 저장된 복사본에서 fd 0을 복원하고 더 이상 필요하지 않은 fd 3을 닫습니다.

1 . Solaris 11 이상에서 Oracle은 결국 (마지막으로) /bin/shPOSIX 쉘을 만들었으므로 이제는 sh대부분의 다른 Unices와 마찬가지로 동작합니다( 다른 Unices와 마찬가지로 shPOSIX에 기반한 확장을 지원하지만 POSIX에서 지정한 언어를 해석합니다 ksh88, sh여기서는 일반적으로 ksh88, pdksh, bash, yash 또는 향상된 ash를 기반으로 함))

관련 정보