Bash는 "잘못된 파일 설명자" 오류 메시지를 표시하지 않습니다.

Bash는 "잘못된 파일 설명자" 오류 메시지를 표시하지 않습니다.

파일 설명자에 쓰려고 할 때 다른 쪽 끝이 쓰기 전에 fd를 닫으면 다음과 같은 오류 메시지가 나타납니다.

./scr.sh: line 5: "$fd": Bad file descriptor

코드는 대략 다음과 같습니다.

f(){
    local fd=$1
    sleep 2
    if command >&"$fd"; then
        echo test >&"$fd" 2>/dev/null
    fi
}

coproc sleep 1
f "${COPROC[1]}"

파일 설명자가 손상되었는지 감지하거나 오류 메시지를 표시하지 않는 방법이 있습니까?


편집: 따라서 명령을 /dev/null로 리디렉션하는 @terdon의 제안 솔루션은 이미 해당 리디렉션이 있는 echo에 의해 오류가 생성되기 때문에 작동하지 않습니다.

coproc을 실행한 후 fds를 복사하려면 Stephane의 솔루션을 선택하세요.

편집 2:

그래서 나는 fd를 복제하기 위한 솔루션이 실제로 예상대로 작동하지 않는다는 것을 알아냈습니다. 서브셸에서 명령을 실행하고 있었기 때문에 "닫힌" fd가 복제될 수 있는지 여부에 대한 테스트가 항상 성공하고 fd가 복제될 때 성공한다는 것을 알았습니다. 실제로는 쉘 종료가 닫힙니다. 문제를 설명하기 위해 위의 예를 축소했습니다.

coproc sleep 1
exec {fd_in}<&"${COPROC[0]}"-
exec {fd_out}>&"${COPROC[1]}"-

sleep 2

if { >&"${fd_out}"; } 2<> /dev/null; then
    echo test >&"$fd_out" 2>/dev/null
fi
echo done #never reaches here

왜 이런 일이 발생하는지 아시나요?

관련 정보