2013-06-28 3 views
2

Я пытаюсь взять stderr из команды и перенаправить его в команду logger -s (который записывает свой вклад в syslog и опции -s посылает копию входных данных для стандарта logger «s ошибка), а затем, наконец, в файл, как это:Перенаправление STDERR к Logger, а затем подать

#!/bin/bash 

ping foobar 2> logger -s 2>> ~/mylog.log 

к сожалению, это создает logger файл и mylog.log файл. Поэтому я предполагаю, что начальный 2> создает файл logger, а затем 2>> создает новый файл mylog.log.

Есть ли способ перенаправить stderr в команду logger?

EDIT

Я стараюсь избегать использования |, потому что я хочу использовать перенаправление в if тестов, а также.

Я также попробовал этот путь:

ping foobar 2> $(logger -s 2>> ~/mylog.log) 

И это не сработало.

+0

Не могли бы вы объяснить, что делать, если тесты, которые вы пытаетесь сделать, не работают с трубой? – ctn

+1

Является ли 'logger' процессом или файлом? Как написано, код создает пустой файл 'logger' для стандартной ошибки, чтобы перейти к нему, затем меняет свое сознание и отправляет стандартную ошибку, чтобы добавить его в' mylog.log'. Вы хотите, чтобы стандартная ошибка была отправлена ​​в оба файла: одна в режиме добавления и одна в режиме простой записи? –

+0

@JonathanLeffler 'logger' - это программа unix, которую я пытаюсь использовать. Я непреднамеренно создаю файл журнала с использованием перенаправления, тогда как я хочу передать 'stderr' в программу unix-журнала logger и перенаправить его в файл. –

ответ

3

Учитывая страницу руководства для logger, вы искали bash «s process substitution и:

ping foobar 2> >(logger -s 2>> ~/mylog.log) 

Это работает ping foobar со стандартной ошибкой будет процесс logger -s с помощью подстановки процессов. Процесс logger записывает информацию в syslog (основная цель logger), а также записывает вывод в стандартную ошибку (опция -s).Второе перенаправление ввода-вывода добавляет стандартную ошибку от logger к файлу ~/mylog.log.

Состояние возврата команды - это статус возврата от ping. Это позволяет избежать использования труб, поэтому вы можете использовать команду, указанную в тестах if и т. Д.

+0

Фантастический! Спасибо! –

+0

Но когда я это делаю: ls 2>> (logger "adsad"), даже если нет ls error, мой syslog содержит строку "adsad". –

+0

@ meso_2600: Я думаю, вы обнаружите, что 'logger' должен это сделать. Если вы попросите его что-то написать, он напишет его в 'syslog'. Вы можете решить, не знает ли «logger», является ли это ошибкой и просто предполагает, что это так, или «logger» знает, что это ошибка, потому что ему было предложено написать его. Результат сети тот же. Когда его просят написать, записывает журнал. –

1

Обычно вы не можете перенаправить несколько файлов. Вот что такое tee для. Кроме того, если вы собираетесь использовать tee, вам нужно использовать трубку.

ping foobar 2>&1 >/dev/null | tee -a ~/mylog.log | logger 

Это перенаправление stderr на stdout, а затем stdout на/dev/null. tee добавляет свой вход в файл ~/mylog.log (-a для добавления), а также копирует его на вывод, который затем подается на logger.

Если вы хотите использовать любую результирующую сложную команду в тесте if, вы можете поместить эту команду в функцию. Вы можете использовать Bash-$PIPESTATUS проверить состояние каждого выхода в трубе (и вернуть его из функции):

function bla { 
    ping | successful_cmd # ... or whatever 
    [ 0 -eq ${PIPESTATUS[0]} ] # return 0 (true) if the exit status of ping was 0 (true) 
} 

Статус возврата функции будет статус возврата последней выполненной команды. Вы можете использовать функцию следующим образом:

if bla; then echo true; else echo false; fi 
# or 
bla && echo success 
+0

, если вы пытались проверить, был ли ping успешным или нет, как это будет работать в тесте if с трубой? –

+0

Первоначально считалось, что 'logger' был файлом, в котором вы хотели сохранить вывод: D Я отредактировал ответ. Также добавлена ​​информация о $ PIPESTATUS. – ctn

2

Если вы хотите только STDERR ...

ping foobar 3>&1 1>&2 2>&3 | logger >> ~/mylog.log 

Это должно поменять sderr и стандартный вывод.