Perl

CentOS 5.3、Perl、bash 命令、隱藏所有輸出到螢幕

  • February 15, 2011

我正在執行以下命令:

[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

所以問題是,無論我使用哪種類型的重定向,我總是得到“找到主機:”行。我嘗試了以下方法:

0>/dev/null
1>/dev/null
2>/dev/null
2>&1
2>&/dev/null

以及我能想到或能夠在網上找到的所有其他變體。我需要並且想要返回的是該命令輸出的第二行(時間戳)。我不明白為什麼我似乎無法影響“找到主機:”行?!?!

我正在通過 perl 執行這些命令,但是當直接在 bash 中執行它們時,我看到了相同的行為。我需要抑制該 host: 行,因為在 perl 中,我使用反引號執行命令以將輸出分配給變數,並根據其他一些條件輸出乾淨的響應。無論如何,該主機行顯示並混淆了我的腳本輸出,儘管它不會影響實際分配給變數的內容。

我的假設是這條線沒有使用普通的 STDIN、STDOUT、STDERR 執行緒,但我似乎無法確定第 4 種輸出方法的任何具體資訊。我發現的每個網站都只談論這三個。

如果有人對此有答案,請告訴我!

PS:這不是顯示此行為的唯一命令, chkconfig 和其他一些命令也這樣做,我真的很想弄清楚如何抑制這種不必要的輸出。

ntpdate 正在將“找到的主機”列印到 stderr,並將其他所有內容列印到 stdout。這會將所有內容重定向到標準輸出:

/usr/sbin/ntpdate -d localhost 2>&1 | egrep 'transmit timestamp' 2>/dev/null | \
tail -1 | awk '{print $4, $5, $6, $7, $8}'

然後 egrep 刪除 ‘host found’ 行,因為它不匹配。

我認為您的困惑可能來自將重定向放在管道的末端而不是管道內。在執行管道的其餘部分之前,您必須找到將額外數據列印到 stderr 的命令(在本例中為 ntpdate)並在該點重定向或抑制 stderr 。

引用自:https://serverfault.com/questions/235887