我正在运行以下命令:
[user@server ~]$ /usr/sbin/ntpdate -d IPREMOVEDFORSECURITY | egrep 'transmit timestamp' | tail -1 | awk '{print $4, $5, $6, $7, $8}'
host found : HOSTREMOVEDFORSECURITY
Tue, Feb 15 2011 12:38:38.321
因此问题是,无论我使用哪种类型的重定向,我总是会得到“host found :”行。我尝试了以下方法:
0>/dev/null
1>/dev/null
2>/dev/null
2>&1
2>&/dev/null
以及我能想到的或在网上找到的所有其他变体。我需要和想要返回的是该命令输出的第二行(时间戳)。我不明白为什么我似乎无法影响“找到主机:”行?!?!
我通过 perl 运行这些命令,但是直接在 bash 中运行它们时,我看到了相同的行为。我需要隐藏该 host: 行,因为在 perl 中,我使用反引号运行命令以将输出分配给变量,并根据其他一些条件输出干净的响应。无论如何,该 host 行都会显示并弄乱我的脚本的输出,尽管它不会影响实际分配给变量的内容。
我在这里假设此行不使用正常的 STDIN、STDOUT、STDERR 线程,但我似乎无法确定有关第四种输出方法的任何具体信息。我发现的每个网站都只谈论这三种。
如果有人知道答案,请告诉我!
PS:这不是唯一显示此行为的命令,chkconfig 和其他一些命令也会这样做,我真的很想弄清楚如何抑制这种不必要的输出。
答案1
ntpdate 将“找到主机”打印到 stderr,并将其他所有内容打印到 stdout。这将把所有内容重定向到 stdout:
/usr/sbin/ntpdate -d localhost 2>&1 | egrep 'transmit timestamp' 2>/dev/null | \
tail -1 | awk '{print $4, $5, $6, $7, $8}'
然后 egrep 删除“主机找到”行,因为它不匹配。
我认为您的困惑可能来自于将重定向放在管道末尾而不是管道内部。您必须找到将额外数据打印到 stderr 的命令(在本例中为 ntpdate)并在该点重定向或抑制 stderr,前管道的其余部分被执行。