無法在檔案描述符、管道、fifo、裝置等的輸出上執行 file(1)

無法在檔案描述符、管道、fifo、裝置等的輸出上執行 file(1)

我想file(1)在另一個命令的輸出上運行該命令,但我得到的只是

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

這在 file-5.04(Red Hat Enterprise Linux Server 版本 6.8)中如預期運作,但在 file-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)

後來就解決了,但是僅有的對於區塊和字元設備,不適用於 FIFOhttps://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;

相關內容