Não é possível executar o arquivo (1) na saída do descritor de arquivo, pipe, fifo, dispositivo, etc.

Não é possível executar o arquivo (1) na saída do descritor de arquivo, pipe, fifo, dispositivo, etc.

Quero executar o file(1)comando na saída de outro comando, mas tudo que consigo é

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

Isso funciona conforme esperado no arquivo 5.04 (Red Hat Enterprise Linux Server versão 6.8), mas não no arquivo 5.14 (Wind River Linux 6.0.0.17).

Responder1

É um bug na biblioteca libmagic que fileestou usando.

Uma solução simples é um "uso inútil de cat":

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

O bug foi introduzido pela primeira vez emhttps://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)

Foi então consertado, masapenaspara dispositivos de blocos e caracteres, NÃO para FIFOs emhttps://github.com/file/file/commit/a9124dcb4e. Umincompletocorreção para <(...)Linux estava emhttps://github.com/file/file/commit/adbe541c32.

A correção para dispositivos poderia ser replicada para FIFOs. Veja o patch no final da resposta (aplique manualmente porque este site confunde as guias e lembre-se de que é contra um repositório MIRROR ONLY).

Mas isso ainda deixa:

mkfifo fifo; file -s fifo

fifo: writable, no read permission

Estúpido e errado, porque o FIFO tem permissão de leitura.

Reparar isso significará reescrever metade da libmagic ou adicionar mais alguns espaguetes ifdef e casos especiais à bagunça horrível.

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;

informação relacionada