Как перенаправить stderr скрипта python3, используя тройник?

Я пользователь Debian и RedHat. Я хотел бы перенаправить stderr (модуль logging) из Python3 скрипт. Сценарий выводит много вещей, и часть, которую я хочу захватить, может быть получена с помощью:

python3 ./script.py --input ./*.txt --verbose 2>> ./script.log

Это добавляет stderr к ./script.log, Но я бы сохранил этот диалог и в терминале. Обычно я добиваюсь этого путем tee команда. Проблема в следующем shell линия (выполнена из bash файл):

pyhton3 ./script.py --input ./*.txt --verbose | tee -a ./script.log

Выводит в терминал, но ничего не выводит ./script.log, Есть идеи, как поступить?

2 ответа

Решение

Для отображения как stdout, так и stderr на терминале, при этом захватывая только stderr в файл, используйте:

python3 ./script.py --input ./*.txt --verbose 2>&1 1>/dev/tty | tee -a script.log

Способ, которым оболочка обрабатывает перенаправления, довольно тонок. Здесь 2>&1 приводит к тому, что команда stderr отправляется на tee команда. 1>/dev/tty в результате вывод команды напрямую идет в терминал. Порядок важен. Если порядок этих перенаправлений будет обратным, ничто не пойдет в трубу. В качестве альтернативы, если 1>/dev/tty были опущены, тогда и stdout, и stderr были бы переданы tee команда.

Вы можете перенаправить ваш stderr на стандартный вывод, а затем передать его тоже так

pyhton3 ./script.py --input ./*.txt --verbose 2>&1 | tee -a ./script.log

Другие вопросы по тегам