Я выполняю следующую команду:
[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:, потому что в 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 в этой точке, перед остальная часть конвейера выполнена.