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
. $fd
11이면 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
}