Из скрипта запускается программа на C и вывод сохраняется в файле:
text
./prog &> prog.log
При этом в терминале ничего, а в файл поступает также stderror.
Если же сделать так:
text
./prg &> grep -v Corrupt > prog.log
то в терминале по-прежнему ничего, но stderror в prog.log не попадает.
Я пробовал всякие варианты, не получается направить stderror на вход grep.
Почему так, перенапрвление же сделано?
Этот вариант вообще не работает, получается prog.log нулевой длины.
Без '|' получается то, на что я и жаловался - grep не получает stderr.
Так что учиться надо нам обоим.
$ 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: Нет такого файла или каталога
Например, в каталоге есть файл 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]
Именно это и делает приведённая ещё во втором посте команда.
Может у тебя не bash? Или ты нас троллишь.
bash. Сейчас попробовал - да, вариант " 2>&1 | grep " работает, stderr перенаправляется в sdtout,
но вчера это не работало. Не знаю, почему. И другие были случаи, когда что-то не работало,
а после перезагрузки работало, но уже не помню, что именно. Кажется, какая-то команда.