URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7581
[ Назад ]

Исходное сообщение
"перенаправление stdout для всех команд bash-скрипта"

Отправлено mikra , 05-Сен-08 12:49 
Здравствуйте.

В начале bash-скрипта хочу единожды перенаправить stdout и stderr в отдельные файлы.

Сейчас в скрипте много громоздких команд с пайпами и перенаправлениями, и каждую приходится завершать перенаправлением незадействованного потока в соответствующий лог-файл. Нельзя ли для всего скрипта назначить stdout и stderr, чтобы потом всё неперенаправленное сливалось туда?

Например :
#####################################
#!/bin/sh

??? STDOUT="/root/stdout.txt"
??? STDERR="/root/stderr.txt"

/bin/ls
/bin/nosuchfile
#####################################

Скрипт при запуске не должен вывести ни строчки. Вывод и ошибки должны быть в файлах.
Простейшее решение запускать весь скрипт с перенаправлениями типа
./script.sh > /root/stdout.txt 2> /root/stderr.txt
мне известно. Хотелось бы обойтись без этого.

Как это сделать?


Содержание

Сообщения в этом обсуждении
"перенаправление для всех команд скрипта"
Отправлено Andrey Mitrofanov , 05-Сен-08 12:58 
>#####################################
>#!/bin/sh
>
>??? STDOUT="/root/stdout.txt"
>??? STDERR="/root/stderr.txt"

exec >"/root/stdout.txt" 2>"/root/stderr.txt"

Ну, или >>, по ввкусу.

>/bin/ls
>/bin/nosuchfile
>#####################################


"перенаправление для всех команд скрипта"
Отправлено mikra , 05-Сен-08 14:27 
>exec >"/root/stdout.txt" 2>"/root/stderr.txt"

Вот спасибо, то что нужно.
Мануал очень небольшой у exec... А обратно вернуть направления потоков?
exec > /dev/tty 2> /dev/tty

Правильно?


"перенаправление для всех команд скрипта"
Отправлено phpcoder , 05-Сен-08 15:13 
>Мануал очень небольшой у exec... А обратно вернуть направления потоков?
>exec > /dev/tty 2> /dev/tty
>
>Правильно?

Не знаю, как правильно, но следуя вашей логике я бы перенаправлял в /dev/stdout и /dev/stderr или просто 1 и 2


"перенаправление для всех команд скрипта"
Отправлено mikra , 05-Сен-08 15:21 
>>Мануал очень небольшой у exec... А обратно вернуть направления потоков?
>>exec > /dev/tty 2> /dev/tty
>>
>>Правильно?
>
>Не знаю, как правильно, но следуя вашей логике я бы перенаправлял в
>/dev/stdout и /dev/stderr или просто 1 и 2

/dev/stdout и /dev/stderr перенаправлены в файл. Вывод в них не попадает на экран. На экран ведёт только /dev/tty

Иными словами это работает, я уточняю можно ли так делать или есть ньюансы.


"перенаправление для всех команд скрипта"
Отправлено Andrey Mitrofanov , 05-Сен-08 16:00 
>Мануал очень небольшой у exec... А обратно вернуть направления потоков?
>exec > /dev/tty 2> /dev/tty
>
>Правильно?

Правильно:

exec 6<&0          # Link file descriptor #6 with stdin.
                   # Saves stdin.
exec < data−file   # stdin replaced by file "data−file"
#[---8<---]
echo; echo; echo
exec 0<&6 6<&−
# Now restore stdin from fd #6, where it had been saved,
#+ and close fd #6 ( 6<&− ) to free it for other processes to use.
#
# <&6 6<&−    also works.

Есть такое слово - ABS, Advanced Bash-Scripting Guide...

>>http://www.opennet.me/docs/RUS/bash_scripting_guide/c11620.h...


"перенаправление stdout для всех команд bash-скрипта"
Отправлено Fuzzy , 05-Сен-08 13:10 
Ещё перенаправить вывод в файлы можна с помощью команды script

man 1 script


"перенаправление stdout для всех команд bash-скрипта"
Отправлено mikra , 05-Сен-08 14:29 
>Ещё перенаправить вывод в файлы можна с помощью команды script
>
>man 1 script

Спасибо, пригодится.
Но, кажется, для моего случая это скорее костыли... А хочется чтоб красиво :)


"перенаправление stdout для всех команд bash-скрипта"
Отправлено Аноним , 09-Сен-08 15:42 
>Ещё перенаправить вывод в файлы можна с помощью команды script

script дает не лог, а typescript файл, который абсолютно бесполезен. Там навалено каких-то временных меток, а если прога юзает какие-то фичи терминала, то вообще ужас. Да хотя бы если просто \r юзает.
Когда в свое время копал, так и не нашел чем этот дебильный typescript преобразовать в нормальный лог.


"перенаправление stdout для всех команд bash-скрипта"
Отправлено angra , 09-Сен-08 16:16 
Перлом :)

"перенаправление stdout для всех команд bash-скрипта"
Отправлено Fuzzy , 09-Сен-08 17:33 
Это баг. :-)

BUGS
     Script places everything in the log file, including linefeeds and
     backspaces.  This is not what the naive user expects.



"перенаправление stdout для всех команд bash-скрипта"
Отправлено madskull , 08-Сен-08 09:56 
>Здравствуйте.
>
>В начале bash-скрипта хочу единожды перенаправить stdout и stderr в отдельные файлы.
>
>

а я обычно тело скрипта "запираю" в фигурные скобки:
#!/bin/bash
{
  # тута все и происходит
} > /root/stdout.txt 2> /root/stderr.txt


"перенаправление stdout для всех команд bash-скрипта"
Отправлено mikra , 08-Сен-08 14:56 
>а я обычно тело скрипта "запираю" в фигурные скобки:
>#!/bin/bash
>{
>  # тута все и происходит
>} > /root/stdout.txt 2> /root/stderr.txt

О, тоже толково.

Спасибо всем за участие и дельные советы :)