질문에 "파일 설명자가 유효한지 테스트”, 파일 설명자가 열려 있는지 테스트하는 테스트를 찾고 있습니다.
답변은 모두 파일 설명자가 열려 있는지 테스트하는 데 중점을 둡니다.산출, 그러나 파일 설명자가 열려 있는지 테스트하는 방법입력하다?
이것은 다른 질문에 대한 답변에 대한 댓글 스레드에 나타 났으며 답변은 다음과 같이 설명되었습니다.
if [ -n "$1" ]; then
# read input from file "$1" (we're assuming it exists)
elif [ ! -t 0 ]; then
# read input from standard input (from pipe or redirection)
else
# no input given (we don't want to read from the terminal)
fi
문제는 파일 설명자가 열려 있으면 테스트가 [ ! -t 0 ]
참 이라는 것입니다.-t
그리고터미널과 연관되어 있습니다. 테스트가 false인 경우 설명자는 다음과 같습니다.누구나닫혀 있거나 터미널과 연결되어 있지 않습니다(즉, 파이프 또는 리디렉션에서 읽는 중입니다). 따라서 테스트에서는 [ ! -t 0 ]
파일 설명자가 유효한지 보장하지 않습니다.
유효한지( read
불평하지 않도록) 또는 꺼져 있는지 어떻게 확인합니까?
답변1
read(fd, 0, 0)
C에서는 또는 를 사용하여 쉽게 확인할 수 있습니다 (fcntl(fd, F_GETFL) & O_WRONLY) == 0
. 표준 유틸리티를 속여 이 작업을 수행할 수는 없으므로 여기에 몇 가지 가능한 해결 방법이 있습니다.
Linux에서는 다음을 사용할 수 있습니다 /proc/PID/fdinfo/FD
.
if [ ! -d "/proc/$$/fd/$fd" ] && grep -sq '^flags.*[02]$' "/proc/$$/fdinfo/$fd"; then
echo "$fd" is valid for input
fi
OpenBSD 및 NetBSD에서는 0과 함께 /dev/fd/FD
사용할 수 있습니다.dd
if dd if=/dev/fd/3 count=0 3<&"$fd" 2>/dev/null; then
echo "$fd" is valid for input
fi
FreeBSD에서는 기본적 으로 처음 3개의 fd만 제공됩니다 /dev/fd
.fdescfs(5)
/dev/fd
if (dd if=/dev/fd/0 count=0 <&"$fd") 2>/dev/null; then
echo "$fd" is valid for input
fi
노트:
일부 시스템에서는 bash
에뮬레이션되므로 /dev/fd/FD
동일한 경고가 에 적용될 cat </dev/fd/7
수 있습니다 .cat /dev/fd/7
gawk
read(2)
길이가 0인(또는 플래그에 길이가 없는 open(2)
) A는O_TRUNC
아니요액세스 시간 또는 기타 타임스탬프를 업데이트하세요.
Linux에서는 read(2)
디렉토리가 열려 있어도 항상 실패합니다.아니요배너 O_DIRECTORY
. 다른 Unix 시스템에서는 디렉토리를 다른 파일처럼 읽을 수 있습니다.
이것기준dd count=0
블록을 복사해서는 안 되는지 여부는 지정되지 않습니다 .모두gdd
파일에서 차단: 전자는 GNU dd( ) 및 dd
*BSD 의 동작입니다 .
답변2
이것은 Linux bash에서 작동하는 것 같습니다.
if read -u $fd -n 0 -t 0 2>/dev/null
then
....
fi