Я хочу выполнить 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
Это ошибка в file
используемой библиотеке libmagic.
Простой обходной путь — «бесполезное использование 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;