파일 설명자에 쓰려고 할 때 다른 쪽 끝이 쓰기 전에 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
왜 이런 일이 발생하는지 아시나요?