shell中“grep”的异常链接

时间:2015-02-08 18:17:49

标签: bash shell grep

我偶然发现了一条奇怪的shell指令:
ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t ; echo $?
我怀疑返回的值会表示错误。任何人都可以确认这一点或解释在哪种情况下该指令将适用?

2 个答案:

答案 0 :(得分:4)

第一个grep只允许包含qmail的行(前面有任何字符,后跟短划线,但这在很大程度上是无关紧要的)。第二个grep删除包含mail的行,这意味着第一个grep传递的每一行都被第二个删除。没有任何东西可供第三个处理,因此文件t将始终为空。 $?的值应为1,失败,因为第三个grep未能找到与其模式匹配的任何行(因为它没有要处理的行)。

这是一个错误。

很难知道如何解决它而不知道它想要做什么。

答案 1 :(得分:1)

bash shell(以及大多数其他shell)允许用户使用一个命令的输出作为另一个命令的输入。这是通过称为管道的|运算符完成的。因此ls -a的输出被输入grep ".qmail-",依此类推。 >运算符将命令的输出发送到文件,在本例中为t。因此ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t列出目录的内容,并在最终将输出保存到文件t之前通过连续过滤器传递输出。

分号表示命令的结束,并允许在一行上输入多个bash命令。

echo $?打印出上次执行的命令的返回值,在本例中为ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t。按照惯例,除了0之外的任何值都表示发生了某种错误。The Linux Documentation Project给出了一些常见退出代码的列表。