Шаблон grep интерпретируется по-разному в 2 разных системах с одинаковой версией grep
Мы производим Linux-устройства для центров обработки данных, и все они работают на Fedora, установленном по одному и тому же процессу. Существуют разные версии аппаратного обеспечения, некоторые с жесткими дисками IDE и некоторые SCSI, поэтому файловые системы могут быть в /dev/sdaN или /dev/hdaN.
У нас есть веб-интерфейс для этих устройств, который показывает использование диска, который генерируется с помощью "df | grep /dev/*da". Как правило, это работает для обеих версий аппаратного обеспечения, выдавая вывод следующим образом:
/dev/sda2 5952284 3507816 2137228 63% /
/dev/sda5 67670876 9128796 55049152 15% /data
/dev/sda1 101086 11976 83891 13% /boot
Однако для одной машины мы получаем следующий результат от этой команды:
Binary file /dev/sda matches
Похоже, что его файлы grepping совпадают с / dev / * da по неизвестному шаблону по какой-то причине, только в этом окне, которое, по-видимому, идентично в версии grep, пакетах, ядре и оборудовании. Я изменил шаблон grep на "/dev/.da", и все работает, как и ожидалось, на этой проблемной коробке, но я ненавижу не знать, почему это происходит. У кого-нибудь есть идеи? Или, может быть, другие тесты, чтобы попробовать?
3 ответа
Вероятно, машина, которая возвращает Binary file...
сообщение содержит более одного диска, вероятно, дисковод компакт-дисков или что-то.
Происходит следующее: если вы не защитите шаблон, он будет расширен оболочкой. Это означает, что
grep /dev/*da
... расширяется до
grep /dev/hda /dev/sda
... что означает grep, посмотрите в файле /dev/sda и верните все строки, соответствующие тексту /dev/hda.
Вы должны защитить образец, такой как
grep '/dev/.da'
... так что оболочка не расширяет его.
Вы можете подтвердить это на компьютере-нарушителе, набрав
ls /dev/*da
# echo -e '#!/bin/sh\ndf | grep /dev/*da' > df.sh
# sh -x df.sh
+ df
+ grep /dev/hda /dev/sda
Binary file /dev/sda matches
man grep
-a, --text
Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
--binary-files=TYPE
If the first few bytes of a file indicate that the file contains binary data, assume that the file
is of type TYPE. By default, TYPE is binary, and grep normally outputs either a one-line message
saying that a binary file matches, or no message if there is no match. If TYPE is without-match,
grep assumes that a binary file does not match; this is equivalent to the -I option. If TYPE is
text, grep processes a binary file as if it were text; this is equivalent to the -a option.
Warning: grep --binary-files=text might output binary garbage, which can have nasty side effects
if the output is a terminal and if the terminal driver interprets some of it as commands.
Я думаю, что проблема в том, как оболочка отправляет '/dev/*da' в grep. Пытаться
echo /dev/*da
на обеих системах.
В любом случае, я думаю, что правильной версией является /dev/.da, потому что для grep * означает "Предыдущий элемент будет совпадать ноль или более раз".