1

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

От man-страниц "bash" (встроенный exec , "Process Substitution") и 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.

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

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

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

2 ответа2

2

Должен признать, я не совсем уверен, какова ваша цель ... однако правильный синтаксис для вашего exec -trick должен быть следующим (вы пропустили только >):

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

Простая демонстрация:

% 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
% 

Вы можете видеть, что exec испортил вывод, напечатав приглашение снова, когда скрипт достигнет этой строки. Так почему бы вам просто не войти, например, в stdout , но не в stderr вашего скрипта?

% (echo stdout; echo stderr >&2) | tee logfile
stderr
stdout
% cat logfile
stdout
0

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

echo this line isn\'t logged
(
  echo this line is logged!
) | tee log_file
echo this line isn\'t logged

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .