LINUX.ORG.RU

[sh][csh][perl] перенаправление STDERR


0

1

Столкнулся со странной проблемой. Пишу перловый скрипт, который среди прочего дергает rc-скрипты в /etc/init.d и проверяет состояние демонов. Надо распарсить output скриптов, но часть сообщений валится в stderr, который перехватить не удается, непонятно почему. Изначально перл запускается из csh (поделие, да, но возможности заменить на другой нет и не будет, должно работать именно в csh).

my $out = `cmd`
благополучно возвращает только stdout.
my $out = `cmd |> cat`
аналогично.
my $out = `sh -c "cmd 2>&1"`
аналогично.

Дошло до того, что

tcsh$ cmd >& logfile.log
тоже отдает в лог только stdout и более того, даже
sh$ cmd 2>&logfile.log
тоже отдает только stdout. Хотя
sh$ cmd 2>/dev/null
stderr в null отправляет исправно

Второй день голову ломаю, посоветуйте выпрямитель для рук

Ответ на: комментарий от babusha

в tcsh такая нотация не поддерживается. можно редиректить только stderr+sdout в файл или пайп (>& или |& соотв.-но), но ни то ни другое не работает.

через вызов sh с 2>&1 не работает тоже - перлу достается только stdout

marvin_yorke ★★★ ()

> my $out = `sh -c «cmd 2>&1»`
> аналогично.

умвр.

$ csh
%perl -e 'chomp, print "-->$_<--\n" for `gcc`'
gcc: не заданы входные файлы
%perl -e 'chomp, print "-->$_<--\n" for `gcc 2>&1`'
-->gcc: не заданы входные файлы<--
%_
arsi ★★★★★ ()
Ответ на: комментарий от arsi

так, ок, ваш пример у меня тоже работает. а вот если заменить вызов gcc на «/etc/ntp status»? у меня он успешно проверяется только от рута, но мне нужно поймать как раз неуспешный вариант

marvin_yorke ★★★ ()
Ответ на: комментарий от marvin_yorke

у меня в слаке инитскрипты и так в stdout пишут :)

arsi ★★★★★ ()
Ответ на: комментарий от Jetty

csh это не мой личный выбор, а требование системы с которой я работаю.. sh пробовал, судя по всему проблема в самих rc-скриптах, пример выше от arsi работает

marvin_yorke ★★★ ()
Ответ на: комментарий от OxiD

вобщем опытным путем было установлено, что проблема в том, что нифига не в STDERR эти rc-скрипты выхлоп валят, а куда-то еще.

http://www.linux.org.ru/jump-message.jsp?msgid=6170217&cid=6170278 вот этот пример работает и STDERR ловит. но если подставить туда 'rcntp status' вместо гцц - ловится только STDOUT в обоих случаях. Куда еще может выхлоп идти, чтобы при этом показываться на консоли?

marvin_yorke ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.