1

Я пользователь 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 ответа2

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 .

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .