The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"перенаправление stdout для всех команд bash-скрипта"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"перенаправление stdout для всех команд bash-скрипта"  
Сообщение от mikra on 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
мне известно. Хотелось бы обойтись без этого.

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

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "перенаправление для всех команд скрипта"  
Сообщение от Andrey Mitrofanov on 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
>#####################################

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Правильно?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "перенаправление для всех команд скрипта"  
Сообщение от Andrey Mitrofanov on 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.ru/docs/RUS/bash_scripting_guide/c11620.h...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

man 1 script

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "перенаправление stdout для всех команд bash-скрипта"  
Сообщение от angra (ok) on 09-Сен-08, 16:16 
Перлом :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру