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