我有一个 bash 脚本可以定期清理邮件队列。出于某些原因,我们选择删除所有发送至 @mms.att.net 和其他 email2SMS 网关且在队列中超过 9 小时但仍未送达的电子邮件。
简单来说,该脚本执行以下操作:
domains=`cat /etc/mail/email2textdomains.txt`
egrep $domains /var/log/maillog | .... other tasks
的内容/etc/mail/email2textdomains.txt
正是
"mms.att.net|vtxt.com|vtext.com|vzwpix.com"
因此,egrep 行应该是这样的,这正是我在命令行中输入的内容。
egrep "mms.att.net|vtxt.com|vtext.com|vzwpix.com" file | ...
如果我像这样运行它,那么它是一个 5 个以上阶段的命令管道,每个命令从前一个标准输出读取标准输入。这显然不是我想做的搜索。
egrep mms.att.net|vtxt.com|vtext.com|vzwpix.com file | ...
然而,在运行时,两个双引号的处理方式不同 - 它们成为字符串的一部分,所以我们本质上是在搜索
- “mms.att.net
- vtxt.com
- vtext.com
- vzwpix.com”
显然,我误解了引用的工作原理 - 解决方案是更改包含的行以删除双引号,导致一行不应该工作,但可以。
我尝试通过管道进行测试,od -a
不显示任何非打印字符。
为什么它有效,使得内容/etc/mail/email2textdomains.txt
正是
mms.att.net|vtxt.com|vtext.com|vzwpix.com
什么时候应该像所写的那样是一个很长的失败管道?