我想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;