Здравствуйте.В начале 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
мне известно. Хотелось бы обойтись без этого.Как это сделать?
>#####################################
>#!/bin/sh
>
>??? STDOUT="/root/stdout.txt"
>??? STDERR="/root/stderr.txt"exec >"/root/stdout.txt" 2>"/root/stderr.txt"
Ну, или >>, по ввкусу.
>/bin/ls
>/bin/nosuchfile
>#####################################
>exec >"/root/stdout.txt" 2>"/root/stderr.txt"Вот спасибо, то что нужно.
Мануал очень небольшой у exec... А обратно вернуть направления потоков?
exec > /dev/tty 2> /dev/ttyПравильно?
>Мануал очень небольшой у exec... А обратно вернуть направления потоков?
>exec > /dev/tty 2> /dev/tty
>
>Правильно?Не знаю, как правильно, но следуя вашей логике я бы перенаправлял в /dev/stdout и /dev/stderr или просто 1 и 2
>>Мануал очень небольшой у exec... А обратно вернуть направления потоков?
>>exec > /dev/tty 2> /dev/tty
>>
>>Правильно?
>
>Не знаю, как правильно, но следуя вашей логике я бы перенаправлял в
>/dev/stdout и /dev/stderr или просто 1 и 2/dev/stdout и /dev/stderr перенаправлены в файл. Вывод в них не попадает на экран. На экран ведёт только /dev/tty
Иными словами это работает, я уточняю можно ли так делать или есть ньюансы.
>Мануал очень небольшой у 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...
Ещё перенаправить вывод в файлы можна с помощью команды scriptman 1 script
>Ещё перенаправить вывод в файлы можна с помощью команды script
>
>man 1 scriptСпасибо, пригодится.
Но, кажется, для моего случая это скорее костыли... А хочется чтоб красиво :)
>Ещё перенаправить вывод в файлы можна с помощью команды scriptscript дает не лог, а typescript файл, который абсолютно бесполезен. Там навалено каких-то временных меток, а если прога юзает какие-то фичи терминала, то вообще ужас. Да хотя бы если просто \r юзает.
Когда в свое время копал, так и не нашел чем этот дебильный typescript преобразовать в нормальный лог.
Перлом :)
Это баг. :-)BUGS
Script places everything in the log file, including linefeeds and
backspaces. This is not what the naive user expects.
>Здравствуйте.
>
>В начале bash-скрипта хочу единожды перенаправить stdout и stderr в отдельные файлы.
>
>а я обычно тело скрипта "запираю" в фигурные скобки:
#!/bin/bash
{
# тута все и происходит
} > /root/stdout.txt 2> /root/stderr.txt
>а я обычно тело скрипта "запираю" в фигурные скобки:
>#!/bin/bash
>{
> # тута все и происходит
>} > /root/stdout.txt 2> /root/stderr.txtО, тоже толково.
Спасибо всем за участие и дельные советы :)