No se puede ejecutar el archivo (1) en la salida del descriptor de archivo, canalización, quincena, dispositivo, etc.

No se puede ejecutar el archivo (1) en la salida del descriptor de archivo, canalización, quincena, dispositivo, etc.

Quiero ejecutar el file(1)comando en la salida de otro comando, pero todo lo que obtengo es

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

Esto funciona como se esperaba en el archivo 5.04 (Red Hat Enterprise Linux Server versión 6.8), pero no en el archivo 5.14 (Wind River Linux 6.0.0.17).

Respuesta1

Es un error en la biblioteca libmagic que fileestá usando.

Una solución sencilla es un "uso inútil de cat":

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

El error se introdujo por primera vez enhttps://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)

Luego se solucionó, perosolopara dispositivos de bloques y caracteres, NO para FIFO enhttps://github.com/file/file/commit/a9124dcb4e. Unincompletola solución para <(...)Linux estaba enhttps://github.com/file/file/commit/adbe541c32.

La solución para dispositivos podría replicarse para FIFO. Vea el parche al final de la respuesta (aplíquelo manualmente porque este sitio destruye las pestañas y tenga en cuenta que se trata de un repositorio SOLO ESPEJO).

Pero eso todavía deja:

mkfifo fifo; file -s fifo

fifo: writable, no read permission

Estúpido y equivocado, porque el FIFO tiene permiso de lectura.

Reparar esto significará reescribir la mitad de libmagic o agregar otro par de espaguetis ifdef y casos especiales al horrible desastre.

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;

información relacionada