LinuxForum.Fans
Тема

stderror > grep

Автор: Peter 13 сообщений 1188 просмотров
#381492

Здравствуйте!

Из скрипта запускается программа на C и вывод сохраняется в файле:

text
./prog &> prog.log

При этом в терминале ничего, а в файл поступает также stderror.
Если же сделать так:

text
./prg &> grep -v Corrupt > prog.log

то в терминале по-прежнему ничего, но stderror в prog.log не попадает.
Я пробовал всякие варианты, не получается направить stderror на вход grep.
Почему так, перенапрвление же сделано?

Пётр.

#381500
text
./prg 2>&1 | grep -v Corrupt > prog.log

Вот. Учи перенаправления потоков.

#381513
"Vascom" написал:
Учи перенаправления потоков.

Ну что это за совет? Нужно было "учи вот это целиком!" : http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Лично я считаю, что людей, которые не знакомы с данным руководством, нельзя называть линуксоидами.

#381528
Vascom написал:
text
./prg 2>&1 | grep -v Corrupt > prog.log

Вот. Учи перенаправления потоков.

Насколько я помню, я это пробовал, но проверю ещё раз.

Пётр.

#381535
Vascom написал:
text
./prg 2>&1 | grep -v Corrupt > prog.log

Вот. Учи перенаправления потоков.

Этот вариант вообще не работает, получается prog.log нулевой длины.
Без '|' получается то, на что я и жаловался - grep не получает stderr.
Так что учиться надо нам обоим.

Пётр.

#381536

У меня всё работает.

Команда, выдающая ошибки:

text
$ ls aaa bbb
ls: невозможно получить доступ к aaa: Нет такого файла или каталога
ls: невозможно получить доступ к bbb: Нет такого файла или каталога

Перенаправляем её на grep, видим что stderr на grep не идёт:

text
$ ls aaa bbb | grep aaa
ls: невозможно получить доступ к aaa: Нет такого файла или каталога
ls: невозможно получить доступ к bbb: Нет такого файла или каталога

Теперь перенаправляем оба потока на grep, видим что всё работает и вывод grep теперь можно в любой файл скинуть.

text
$ ls aaa bbb 2>&1 | grep aaa
ls: невозможно получить доступ к aaa: Нет такого файла или каталога
#381541

Пргограмма моя, на C, я помню, что при перенаправлении вывода перед grep
и с '|' вывод grep получался пустой при разных вариантах.

Пётр.

#381562

Что значит "помню"?

#381566
Vascom написал:
Что значит "помню"?

Помню, что при перенаправлении вывода перед grep
и с '|' вывод grep получался пустой при разных вариантах.

Пётр.

#381573
"Peter" написал:
на что я и жаловался - grep не получает stderr

Например, в каталоге есть файл cc, но нет файлов aa и bb.
То есть командное выражение
[console]ls -l aa bb cc[/console]
выдаст stderr:

text
ls: невозможно получить доступ к aa: Нет такого файла или каталога
ls: невозможно получить доступ к bb: Нет такого файла или каталога

и stdout:

text
-rw-r--r-- 1 inhabt inhabt 0 май 27 19:54 cc

Все три строчки одной кучей.
---
Выражение
[console]ls -l aa bb cc >/dev/null[/console]
выдаст нужный stderr, потому что stdout "ушёл в пустоту" (/dev/null):

text
ls: невозможно получить доступ к aa: Нет такого файла или каталога
ls: невозможно получить доступ к bb: Нет такого файла или каталога

Этот stderr можно передать через subshell как stdout+stderr:
[console](ls -l aa bb cc >/dev/null) |& cat[/console]
Результат:

text
ls: невозможно получить доступ к aa: Нет такого файла или каталога
ls: невозможно получить доступ к bb: Нет такого файла или каталога

И уже этот результат можно передать и grep, и дальше - в файл:
[console](ls -l aa bb cc >/dev/null) |& grep aa > prog.log[/console]

Подходит?

#381590

Так мне надо sdterr перенаправить в stdout и уже всё вместе на вход grep.

Пётр.

#381607

Именно это и делает приведённая ещё во втором посте команда.
Может у тебя не bash? Или ты нас троллишь.

#381614
Vascom написал:
Именно это и делает приведённая ещё во втором посте команда.
Может у тебя не bash? Или ты нас троллишь.

bash. Сейчас попробовал - да, вариант " 2>&1 | grep " работает, stderr перенаправляется в sdtout,
но вчера это не работало. Не знаю, почему. И другие были случаи, когда что-то не работало,
а после перезагрузки работало, но уже не помню, что именно. Кажется, какая-то команда.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.