ファイル記述子、パイプ、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;

関連情報