我们为数据中心制作了一个linux设备,并且都运行从同一个kickstart进程安装的fedora。 有不同的硬件版本,有些是IDE硬盘和一些SCSI,所以文件系统可能在/ dev / sdaN或/ dev / hdaN。
我们在这些设备中有一个Web界面,显示使用“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”,并且在这个麻烦的盒子上,一切都按预期工作,但我不知道为什么会发生这种情况。 有人有主意吗? 或者也许还有其他一些testing呢?
可能是返回Binary file...
消息的机器有多个磁盘,可能是CD驱动器或其他东西。
发生的事情是,如果你不保护模式,它会被shell扩展。 这意味着
grep /dev/*da
…扩大到
grep /dev/hda /dev/sda
…这意味着grep,查看文件/ dev / sda并返回所有匹配文本“/ dev / hda”的行。
你需要保护的模式,如
grep '/dev/.da'
…这样的shell不会扩大它。
你可以通过键入在违规机器上确认这一点
ls /dev/*da
我认为这个问题是关于shell如何发送'/ dev / * da'到grep。 尝试
echo /dev/*da
在两个系统上。
无论如何,我认为正确的版本是/dev/.da,因为对于grep *意味着“前面的项目将被匹配零次或多次”。
# 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.