변수( while .... )에 대한 하위 쉘 리디렉션 오류 $3 > $testdir/$testfile.log

변수( while .... )에 대한 하위 쉘 리디렉션 오류 $3 > $testdir/$testfile.log

내 스크립트는 다음과 같이 하위 쉘 명령을 실행합니다.

 ( while ..... ) $3>$testdir/$testfile.log

오류가 발생합니다.

line 75: syntax error near unexpected token `$3'
line 75: `    ) $3>$testdir/$testfile.log'

여러 가지 옵션을 시도해 보았는데 >변수가 아닌 하드코딩된 숫자인 경우에만 만족하는 것 같습니다. 괄호가 빠졌나요?

답변1

당신 말이 맞습니다. 쉘 구문은 다음과 같은 것만 허용합니다.

`#>'

#한 자리 숫자는 어디에 있습니까?

쉘은 여러 숫자를 지원할 수 있지만 POSIX는 이 동작을 지정하지 않습니다.

여기서 변수 확장을 수행할 수 있다는 것은 지정된 구문을 훨씬 뛰어넘는 것입니다.

그러나 eval확장된 텍스트를 사용하고 파서를 다시 호출할 수 있습니다.

답변2

셸 구문은 제한되어 있습니다. 리디렉션은 리디렉션 연산자 바로 앞에 있는 한 자리 숫자로만 나타낼 수 있습니다. 여러 개의 숫자, 중간 공백 또는 변수 확장으로 인한 숫자가 있을 수 없습니다.

파일 설명자 번호가 변수에 있으면 eval리디렉션을 수행하는 셸 코드 조각에 연결될 수 있습니다. 대부분의 스크립트를 eval문자열 에 넣지 않으려면 exec내장 함수를 사용하여 리디렉션을 수행하세요. 예를 들어, 하드코딩된 파일 설명자 번호가 있는 코드인 경우

( … ) 3>foo

그런 다음 이 코드를 사용하여 변수가 나타내는 파일 설명자로 리디렉션할 수 있습니다 fd.

( eval "exec $fd>foo"; … )

1 이 확장을 지원하는 특정 셸에서만 사용할 수 있습니다.

관련 정보