Bash: захватывает стандартный вывод FD (out / err) и вводит в функцию - PullRequest
0 голосов
/ 25 февраля 2011

Я хотел бы создать универсальную функцию, которая фиксирует выходные данные скрипта и вставляет их в журнал. Caputre начнется в начале файла. Журнал имеет следующий формат: [тег] [время]: текст. Я сделал этот код (на основе Bash Расширенное руководство по написанию скриптов

файл lib

batch_init

function batch_init {
    here=$(dirname $0)
    . ${here}/../etc/batch.conf
    scriptName=$1
    batch_exec_uid=$$
    fifoFile="${tmp_dir}${scriptName}.${batch_exec_uid}.fifo"
    curTime="$(date +%H%M%S)"
    logFileName="$(basename ${scriptName}).${curTime}.${batch_exec_uid}.log"
}

batch_log

function batch_log {
    level="info"
    OPTIND=1

    read content

    while getopts :x:y: OPTION
    do
      case $OPTION in
       x) flag_x=1
          content=$OPTARG
          ;;
       y) flag_y=1
          level=$OPTARG
          ;;
      esac
    done

    if [ ! -d $log_dir ]
    then
        echo "log_dir is missing, maybe conf file is not called"
        exit 2
    fi

    date=$(date +%Y-%m-%d)
    final_dir="${log_dir}/${date}"
    if [ ! -d $final_dir ]
    then
        mkdir $final_dir
    fi
    if [ -z $logFileName ]
    then
        echo "logFileName is missing, maybe batch_init was not called"
        exit 2
    fi
    fullPath=${final_dir}/${logFileName}
    echo "[${level}][$(date +%H:%M:%S)]: ${content}" >> $fullPath
}

batch_end

function batch_end {
    exec 1<&6 6<&-
    rm $fifoFile
    if [ ${1:-error} == error ]
    then
        return 2
    else
        return 0
    fi
}

#start capture
batch_init $1
exec > $fifoFile | batch_log

пакетный скрипт

#!/bin/bash
. /home/batch/lib/core.sh $0
echo "foo bar"
echo "blah"

batch_end
exit $?

Но это не работает: '( я не могу передать exec своей функции (batch_log). Есть идеи?

спасибо за ваши ответы

1 Ответ

1 голос
/ 28 февраля 2011

Хорошо, это просто специальный синтаксис для перенаправления потока в функцию:

# replace 
exec > $fifoFile | batch_log
# by
exec 1> >( batch_log -y info)
exec 2> >( batch_log -y error)

см. Также: Добавление текста к перенаправлениям stderr в bash

...