2

bashで、他のシェル スクリプトを呼び出すラッパーを作成しました。ただし、ラッパーからの出力のみを印刷する必要があり、呼び出されたスクリプトからの出力は避けて、基本的にログ ファイルに記録します。

精緻化中…..

基本的に私は関数を次のように使用しています

start_logging ${LOGFILE}
{
Funtion1
Funtion2
} 2>&1 | tee -a ${LOGFILE}

start logging は次のように定義されます:- (この機能は部分的にしか理解できませんでした)

 start_logging()
{
## usage: start_logging
## start a new log or append to existing log file
declare -i rc=0
    if [ ! "${LOGFILE}" ];then
    ## display error and bail
   fi
local TIME_STAMP=$(date +%Y%m%d:%H:%M:%S)
## open ${LOGFILE} or append to existing ${LOGFILE} with timestamp and actual command line
if [ ${DRY_RUN} ]; then
    echo "DRY_RUN set..."
    echo "${TIME_STAMP} Starting $(basename ${0}) run: '${0} ${ORIG_ARGS}'"  { I}
    echo "DRY_RUN set..."
    echo "Please ignore \"No such file or directory\" from tee..."
else
    echo "${TIME_STAMP} Starting $(basename ${0}) run: '${0} ${ORIG_ARGS}'"
    echo "${TIME_STAMP} Starting $(basename ${0}) run: '${0} ${ORIG_ARGS}'"
fi
return ${rc}
}    

LOGFILE は、ラッパーで次のように定義されています。

{
TMPDIR  ="$/tmp" 
LOGFILE="${TMPDIR}/${$}/${BASENAME%.*}.log
}

基本的に他のbashスクリプトを呼び出すfuntion1、funtion2を呼び出すと、ファイル.ie { TMPDIR}/${$}/${BASENAME%.*}.log }およびbash端末にすべての出力が記録されます。

ラッパーに書き込んだ内容のみを bash ターミナルにエコーし、残りはログに記録する必要がありました。

注意してください:-ラッパーから呼び出されたスクリプトにはエコー機能がありますが、ターミナルに出力を表示する必要はありません

果たして達成できるのか……。

4

2 に答える 2

1

のため、端末に出力が得られますtee。だからあなたはできる:

start_logging ${LOGFILE}
{
Funtion1
Funtion2
} 2>&1 | tee -a ${LOGFILE} >/dev/null
                           ^^^^^^^^^^ - redirect the output from a tee to /dev/null

または単に削除しtee、すべてのログをファイルにのみリダイレクトします

start_logging ${LOGFILE}
{
Funtion1
Funtion2
} 2>&1 >${LOGFILE}

または、スクリプトのより大きな部分については、その部分を( )ペアで囲み、サブシェルで実行して、出力を にリダイレクトします/dev/null

(
start_logging ${LOGFILE}
{
Funtion1
Funtion2
} 2>&1 | tee -a ${LOGFILE}
) >/dev/null
于 2013-06-20T10:14:42.610 に答える