CentOS 5.3, Perl, команды bash, Скрыть ВСЕ выходные данные на экран

Я запускаю следующую команду:

[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

И любой другой вариант, который я могу придумать или найти в Интернете. Все, что мне нужно и нужно вернуть, - это вторая строка (метка времени) вывода этой команды. Я не понимаю, почему я не могу повлиять на строку "host found:"?!?!

Я запускаю эти команды через perl, однако я вижу то же поведение при запуске их непосредственно в bash. Мне нужно подавить эту строку host: line, потому что в perl я запускаю команду с помощью обратных кавычек, чтобы назначить вывод переменной и вывести чистый ответ на основе некоторых других условий. Независимо от того, что строка хоста показывает и запутывает вывод моего скрипта, хотя это не влияет на то, что фактически назначено переменной.

Мое предположение здесь состоит в том, что эта строка не использует обычные потоки STDIN, STDOUT, STDERR, но я не могу точно определить какую-либо конкретную информацию о 4-м методе вывода. Каждый сайт, который я нашел, говорит только об этих трех.

Если у кого-то есть ответ на этот вопрос, пожалуйста, пожалуйста, дайте мне знать!

PS: это не единственная команда, которая показывает это поведение, chkconfig и некоторые другие тоже делают это, и я бы очень хотел выяснить, как подавить этот ненужный вывод.

1 ответ

Решение

ntpdate печатает 'host found' в 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 в этой точке, прежде чем будет выполнен остальной конвейер.

Другие вопросы по тегам