Как записать вывод части скрипта оболочки

753
Carsten Scholtes

Я ищу краткое решение для записи вывода части сценария оболочки в файл. Кроме того, я все еще хочу иметь возможность следить за выводом жизни на экран.

От man-страниц "bash" (встроенный exec, "Подстановка процессов") и tee, я бы ожидал, что следующая строка (вызываемая в начале части, которая будет зарегистрирована) будет решением:

exec >(tee -a logfile) 2>&1 

К сожалению, это приводит к ошибкам разрешения (извините, оригинальный вывод на немецком языке):

$ bash t t: Zeile 1: /dev/fd/63: Keine Berechtigung t: Zeile 1: exec: /dev/fd/63: Kann nicht ausführen: Keine Berechtigung 

Система основана на Ubuntu 12.04 LTS.

Как протоколировать часть скрипта в файл?

(Собрать часть, которую нужно проколотить в функцию, fи использовать f | tee -a logfileее будет сложно, так как эта часть простирается через (части) нескольких функций, и я хотел бы переключаться logfileмежду ними ...)

Заранее спасибо.

1
что в твоем сценарии `t`? ernie 10 лет назад 0
Показанный вывод появляется, если `t` содержит только одну строку` exec> (tee -a logfile) 2> & 1`. Я также добавил `echo" foo "` после этой строки. Результирующий вывод точно такой же, как указано выше. Видимо, скрипт завершается сразу после отображения сообщений об ошибках. Файл `logfile` даже не создан. Carsten Scholtes 10 лет назад 0

2 ответа на вопрос

2
mpy

I must admit, I'm not completely sure what's your goal... however, the correct synat for your exec-trick should be as follows (you only missed a >):

exec > >(tee -a logfile) 2>&1 

A simple demonstration:

% cat test #!/bin/bash echo stdout not logged echo stderr not logged >&2 exec > >(tee -a logfile) 2>&1 echo stdout logged echo stderr logged >&2 % bash test stdout not logged stderr not logged % stdout logged stderr logged % cat logfile  stdout logged stderr logged % 

You can see, the exec messes up the output by printing the prompt again, when the script reaches that line. So why don't you just log e.g. stdout, but not stderr of your script?

% (echo stdout; echo stderr >&2) | tee logfile stderr stdout % cat logfile stdout 
Большое спасибо за указание и исправление моей синтаксической ошибки. Правильная команда - именно то, что я искал. Carsten Scholtes 10 лет назад 0
0
wingedsubmariner

Вы можете обернуть строки, которые вы хотите войти в скобки, а затем передать вывод через tee:

echo this line isn\'t logged ( echo this line is logged! ) | tee log_file echo this line isn\'t logged 
Спасибо за ваше предложение. К сожалению, это будет трудно реализовать по тем же причинам, которые затрудняют сборку части, которая должна быть прокодирована, в функцию. Carsten Scholtes 10 лет назад 0

Похожие вопросы