Принудительно запускать `tee` для каждой команды в сценарии оболочки? - PullRequest
4 голосов
/ 27 октября 2010

Я хотел бы иметь сценарий, в котором все команды tee 'd для файла журнала.

Сейчас я выполняю каждую команду в сценарии, таким образом:

<command> | tee -a $LOGFILE

Есть ли способ заставить каждую команду в скрипте оболочки передать tee?

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

Ответы [ 4 ]

15 голосов
/ 28 октября 2010

Вы можете сделать обертку внутри вашего скрипта:

#!/bin/bash
{
echo 'hello'
some_more_commands
echo 'goodbye'
} | tee -a /path/to/logfile

Edit:

Вот еще один способ:

#!/bin/bash
exec > >(tee -a /path/to/logfile)
echo 'hello'
some_more_commands
echo 'goodbye'
2 голосов
/ 28 октября 2010

Предполагая, что ваш скрипт не принимает аргумент --tee, вы можете сделать это (если вы используете этот аргумент, просто замените --tee ниже аргументом, который вы не используете):

#!/bin/bash

if [ -z "$1" ] || [ "$1" != --tee ]; then
  $0 --tee "$@" | tee $LOGFILE
  exit $?
else
  shift
fi
# rest of script follows

Сценарий просто перезапускается сам, используя специальный аргумент --tee, чтобы предотвратить бесконечную рекурсию, передавая свой вывод в tee.

2 голосов
/ 28 октября 2010

Почему бы не открыть оболочку, которая просто:

/path/to/yourOriginalScript.sh | tee -a $LOGFILE

Ваши пользователи не должны выполнять (или даже не знать о них) yourOriginalScript.sh.

1 голос
/ 28 октября 2010

Некоторым подходом будет создание сценария runner "run_it", при котором все пользователи будут вызывать свои собственные сценарии.

run_it my_script

Вся магия будет совершена внутри, например, может выглядеть так:

LOG_DIR=/var/log/
$@ | tee -a  $LOG_DIR/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...