LINUX.ORG.RU

Как писать в консоль только stderr, а в лог-файл - и stdout, и stderr?

 


0

2

Всем привет. Сабж. Гуглятся всякие презабавнейшие вещи - https://serverfault.com/a/63708, https://stackoverflow.com/a/692407/4247442, но не то. Из второй ссылки в принципе можно родить то что нужно, но я не уверен в корректности решения: не будут ли два tee в один файл конфликтовать друг с другом или путать порядок записываемых данных из-за race conditions?

★★★★★

не будут ли два tee в один файл конфликтовать

Наверное, ничего страшного не будет. В любом случае, хоть с tee, хоть без, ты объединяешь два потока. При чтении из stdout и stderr, скорее всего, используется построчная буферизация, так что максимум может пара строк из разных потоков местами попутаться.

Можешь вместо обычного файла сначала в один fifo писать из обоих tee, а из fifo уже в файл.

anonymous
()
~$ ( echo out; echo err >&2 ) 2>&1 >out.txt | tee err.txt >&2
err
~$ cat out.txt
out
~$ cat err.txt 
err
E ★★★
()
Ответ на: комментарий от anonymous

если с /dev/fd:

Из трёх предложенных вариантов работает как надо только этот. Спасибо. :) Хотя нифига не понял как. :) «2>&1» вроде как объединяет stderr и stdout, по идее нивелируя смысл «>&2» перед ним; и «>&3» после этого объединения что делает?

В общем, загадочно это всё, подумываю может простенький C++ скриптик зафигачить на epoll, с параметрами [-a] file command [args] — так я смогу тупо и прямолинейно захватывать и stdout, и stderr вызываемой команды.

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

Действительно, в баше не работает. Я проверял в zsh. В баше, по всей видимоси, без tee не обойтись.

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