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 file
verwendeten 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;