파일 설명자, 파이프, FIFO, 장치 등의 출력에서 ​​file(1)을 실행할 수 없습니다.

파일 설명자, 파이프, FIFO, 장치 등의 출력에서 ​​file(1)을 실행할 수 없습니다.

다른 명령의 출력에 대해 이 명령을 실행 하고 싶지만 file(1)얻을 수 있는 것은

$ file -sL <(echo \#include \<stdio.h\>)
/dev/fd/63: ERROR: (null)

이는 파일 5.04(Red Hat Enterprise Linux Server 버전 6.8)에서는 예상대로 작동하지만 파일 5.14(Wind River Linux 6.0.0.17)에서는 작동하지 않습니다.

답변1

이것은 사용되는 libmagic 라이브러리의 버그입니다 file.

간단한 해결 방법은 "cat을 아무것도 사용하지 않는 것"입니다.

echo '#! /bin/sh' | file -
cat /path/to/fifo-or-special | file -

이 버그는 다음에서 처음 소개되었습니다.https://github.com/file/file/commit/fb6084e0f08:

commit fb6084e0f08aef8991afcb3eb74168a456601908
Author: Christos Zoulas <[email protected]>
Date:   Tue May 28 21:24:31 2013 +0000

    don't print a space if there was an error. (from Jan Kaluza)

나중에 해결됐지만오직블록 및 문자 장치의 경우 FIFO에서 작동하지 않습니다.https://github.com/file/file/commit/a9124dcb4e. 하나불완전한Linux의 수정 사항은 <(...)다음 위치에 있습니다.https://github.com/file/file/commit/adbe541c32.

장치 수리는 FIFO에 복사될 수 있습니다. 답변 끝에 있는 패치를 참조하세요(사이트에서 탭이 분리되므로 수동으로 적용하고 미러 전용 저장소용이라는 점을 기억하세요).

그러나 이것은 여전히 ​​남아 있습니다:

mkfifo fifo; file -s fifo

fifo: writable, no read permission

FIFO에 읽기 액세스 권한이 있기 때문에 어리 석고 잘못되었습니다.

이 문제를 해결한다는 것은 libmagic의 절반을 다시 작성하거나 끔찍하게 엉망인 ifdef 스파게티와 특수 사례를 추가하는 것을 의미합니다.

diff --git a/src/fsmagic.c b/src/fsmagic.c
index 5204f20d..20b7f438 100644
--- a/src/fsmagic.c
+++ b/src/fsmagic.c
@@ -270,8 +270,10 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
    /* TODO add code to handle V7 MUX and Blit MUX files */
 #ifdef S_IFIFO
    case S_IFIFO:
-       if((ms->flags & MAGIC_DEVICES) != 0)
+       if((ms->flags & MAGIC_DEVICES) != 0) {
+           return 0;
            break;
+       }
        if (mime) {
            if (handle_mime(ms, mime, "fifo") == -1)
                return -1;

관련 정보