Datei(1) kann bei Ausgabe von Dateideskriptor, Pipe, FIFO, Gerät usw. nicht ausgeführt werden

Datei(1) kann bei Ausgabe von Dateideskriptor, Pipe, FIFO, Gerät usw. nicht ausgeführt werden

Ich möchte den file(1)Befehl auf der Ausgabe eines anderen Befehls ausführen, aber ich erhalte nur

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

Dies funktioniert wie erwartet in Datei 5.04 (Red Hat Enterprise Linux Server Version 6.8), jedoch nicht in Datei 5.14 (Wind River Linux 6.0.0.17).

Antwort1

Es handelt sich um einen Fehler in der fileverwendeten Libmagic-Bibliothek.

Ein einfacher Workaround ist ein „nutzloser Einsatz von cat“:

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

Der Fehler wurde erstmals eingeführt inhttps://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)

Es wurde dann behoben, abernurfür Block- und Zeichengeräte, NICHT für FIFOs inhttps://github.com/file/file/commit/a9124dcb4e. EinunvollständigFix für <(...)unter Linux war inhttps://github.com/file/file/commit/adbe541c32.

Der Fix für Geräte könnte für FIFOs repliziert werden. Siehe den Patch am Ende der Antwort (manuell anwenden, da diese Site Tabs verstümmelt, und bedenken Sie, dass es sich um ein NUR-SPIEGEL-Repo handelt).

Aber es bleibt noch:

mkfifo fifo; file -s fifo

fifo: writable, no read permission

Dumm und falsch, denn der FIFO hat Leserechte.

Um dies zu reparieren, muss entweder die Hälfte von libmagic neu geschrieben werden, oder zu diesem schrecklichen Durcheinander muss noch ein weiteres ifdef-Spaghetti und Sonderfälle hinzugefügt werden.

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;

verwandte Informationen