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

관련 정보