파일 설명자가 유효한지 테스트(입력용)

파일 설명자가 유효한지 테스트(입력용)

질문에 "파일 설명자가 유효한지 테스트”, 파일 설명자가 열려 있는지 테스트하는 테스트를 찾고 있습니다.

답변은 모두 파일 설명자가 열려 있는지 테스트하는 데 중점을 둡니다.산출, 그러나 파일 설명자가 열려 있는지 테스트하는 방법입력하다?

이것은 다른 질문에 대한 답변에 대한 댓글 스레드에 나타 났으며 답변은 다음과 같이 설명되었습니다.

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/7gawk

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 

관련 정보