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