함수 내부의 명명된 파일 설명자 오류로 리디렉션

함수 내부의 명명된 파일 설명자 오류로 리디렉션

Bash에는 파일 설명자 번호를 선택하여 변수에 할당하는 기능이 있습니다.

$ exec {fd}>foo.txt
$ echo "$fd"
11
$ echo "bar" >&$fd
$ cat foo.txt
bar

이 기능은 bash 4.4에서는 잘 작동하지만 bash 4.2에서는 함수에서 사용할 때 문제가 발생했습니다. 다음은 최소한의 데모입니다.

$ bash --version | head -1
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
$ (func() { echo 1>&$fd; }; type func)
func is a function
func () 
{ 
    echo &>$fd
}
$ (func() { echo 2>&$fd; }; type func)
func is a function
func () 
{ 
    echo 2>&$fd
}

첫 번째 테스트에서는 가 1>&$fd됩니다 &>$fd. $fd11이면 fd 11로 리디렉션되지 않고 대신 다음으로 리디렉션됩니다.문서그러나 이름 11은 표준 출력에서만 작동합니다. 두 번째 테스트에서 볼 수 있듯이 stderr에는 이 오류가 없습니다.

bash 4.4도 마찬가지입니다.

$ bash --version | head -1
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
$ (func() { echo 1>&$fd; }; type func)
func is a function
func () 
{ 
    echo 1>&$fd
}

이는 수정된 버그인 것 같습니다. 정말? 더 중요한 것은 해결 방법을 제안해 주실 수 있나요?

답변1

해결 방법은 원하는 동작을 유지하면서 오류를 방지하는 것입니다 >&. 1<&fd를 복사할 때 fd가 읽기 또는 쓰기용으로 열리는지는 중요하지 않습니다.dup2()신경쓰지 마세요.

$ bash --version | head -1
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
$ (func() { echo 1<&$fd; }; type func)
func is a function
func () 
{ 
    echo 1<&$fd
}

관련 정보