有人可以解释一下 crud 是什么以及 grep 在这种情况下究竟是如何工作的吗?
file $(grep –irl crud /usr/src/linux-2.4)
答案1
让我们来分析一下。首先,这种$(command)
格式称为“命令替换”。它是一种返回命令输出的方式,本质上是创建一个变量,其值是该命令的输出。例如:
$ echo foo
foo
$ var=$(echo foo) ## set the output of 'echo foo' to the variable $var
$ echo "$var"
foo
现在,在本例中,运行的命令是grep -irl crud /usr/src/linux-2.4
。要理解这意味着什么,请运行man grep
并查看这三个(i
、r
和l
)选项的作用:
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input
files.
-r, --recursive
Read all files under each directory, recursively, following
symbolic links only if they are on the command line. Note that
if no file operand is given, grep searches the working
directory. This is equivalent to the -d recurse option.
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match.
总而言之,这意味着“递归遍历所有文件/usr/src/linux-2.4
并在每个文件中不区分大小写地搜索单词crud
,然后打印任何匹配的文件的名称”。
因此,该命令将打印包含单词 的文件名列表crud
。因为我们正在运行file $(grep . . . )
,这意味着该命令file
(打印出文件类型和有关该文件的一些信息)将在 所返回的每个文件上运行grep
。
综上所述,该命令将打印出包含/usr/src/linux-2.4
字符串的所有文件的基本文件信息crud
。在我的 14.04 机器上,该命令返回:
$ file $(grep -irl crud /usr/src/)
/usr/src/linux-headers-3.16.0-77/include/linux/pktcdvd.h: C source, ASCII text
/usr/src/linux-headers-3.16.0-77/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text
/usr/src/linux-headers-3.13.0-108/include/linux/pktcdvd.h: C source, ASCII text
/usr/src/linux-headers-3.13.0-108/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text
/usr/src/linux-headers-3.13.0-46/include/linux/pktcdvd.h: C source, ASCII text
/usr/src/linux-headers-3.13.0-46/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text
/usr/src/linux-headers-3.16.0-30/include/linux/pktcdvd.h: C source, ASCII text
/usr/src/linux-headers-3.16.0-30/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text
答案2
file
根据帮助,确定所处理文件的类型。命令$(grep -irl crud /usr/src/linux-2.4)
为:
$(<command>)
捕获内部命令的值。grep -irl crud /usr/src/linux-2.4
,是内部命令,它递归搜索字符串 crud(忽略大小写),并仅打印包含匹配项的文件的名称。
因此,完整的命令是在目录内查找与字符串 crud 匹配的文件类型/usr/src/linux-2.4