Перенаправление stdout и stderr и на экран и в файл

Перенаправление stdout и stderr и на экран и в файл

04.02.2016 06:24:29 Просмотров 28 Источник

Как в начале скрипта перенаправить вывод в файл и на экран одновременно?

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb#comment583247_489152
Спасибо. Работает!

Ответы - Перенаправление stdout и stderr и на экран и в файл / Перенаправление stdout и stderr и на экран и в файл

Nick Volynkin

04.02.2016 06:37:08

Вам нужна команда tee.

echo foo | tee foo.txt

Синтаксис:

tee [ -a ] [ -i ] [ filename ... ]

-a Не переписывать файл, а добавить строки
-i Игнорировать ошибки

Есть ещё команда со смешным именем pee — так же, только для pipe'ов.

https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb/489160#comment583171_489160
Не получается ничего толкового через tee - по-прежнему вывод идет только на экран. Хотя в инете все пишут, что работает.
https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb/489160#comment583174_489160
@ОлегС а как вы пробовали? покажите код?
https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb/489160#comment583181_489160
"""#!/bin/sh source_system="/home/test/get_data.sh" log_file="/home/test/"date +%Y-%m-%d_%H:%M:%S".log" $source_system | tee -a $log_file ls asfasffasasffas | tee -a $log_file""" каталога asfasffasasffas нет, а ошибка идет в консоль.
Является ответом!
aleksandr barakin

04.02.2016 07:08:34

написанное ниже справедливо, насколько я знаю, лишь для «продвинутых» оболочек типа gnu/bash и zsh.


для перенаправления всего, что будут выдавать команды, выполняющиеся внутри скрипта, в файл (вдобавок к выводу на терминал), можно использовать команду exec в комплекте с программой tee.

если требуется записывать в файл file только то, что команды скрипта будут выдавать в stdout, можно написать так:

exec > >(tee file)
command1
command2

если же требуется записывать в файл и то, что отправляется в stderr, то надо добавить перенаправление 2>&1:

exec > >(tee file) 2>&1
command1
command2

дополнение по поводу просто вывода в файл обоих потоков полностью posix-совместимым образом

и stdout и stderr, в которые выведут информацию команды, будут записаны в file:

exec >file 2>&1
command1
command2

а так file будет дополнен (а не перезаписан, как в предыдущем примере):

exec >>file 2>&1
command1
command2
https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb/489167#comment760012_489167
Кстати, а как это отменить? То есть как вернуть stdout и stderr к умолчальному поведению?
https://ru.stackoverflow.com/questions/489152/%d0%9f%d0%b5%d1%80%d0%b5%d0%bd%d0%b0%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-stdout-%d0%b8-stderr-%d0%b8-%d0%bd%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd-%d0%b8-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb/489167#comment760062_489167
@NickVolynkin, изнутри этого скрипта? ну, наверно, через файловые дескрипторы родительского процесса (его pid находится в переменной окружения PPID). как-нибудь так: echo текст > /proc/$PPID/fd/1 (здесь 1 — это stdout).
Закрыть X