stdoutおよび/またはstderrを変数のパスにリダイレクトする

stdoutおよび/またはstderrを変数のパスにリダイレクトする

stdoutおよび/またはstderrを変数に指定したパスにどのようにリダイレクトしますか?メモ:変数を上書きしたくありません。それ自体、変数で指定されたファイルにstd [xxx]を書きたいです。

たとえば、コマンドが失敗した場合は、失敗メッセージをscp印刷するのではなく(失敗した場合はどうかわからない)、指定されたログファイルに出力する単純なスクリプトです。ログファイルのパスは変数に保存されます。stderrstdout$LOG

LOG=/path/to/file.log
scp file1 host@remote

# do 'whatever' if scp command succeeds:
if [ $? = 0 ];
then
    whatever
else
    # else log both stdout/stderr to ${LOG} file
    &>"${LOG}"
    # DEBUG - print contents of ${LOG} var for testing purposes
    printf "${LOG}"

このスクリプトの結果は、/path/to/file.logファイルに何も/path/to/file.log表示せずに単にstdout&>

私は特定のコマンドが動作していることを確認したので、scpこれは基本的な問題ではないことを知っています。

それとも、これがカスタムログファイルを処理する最も正しい方法ですか?ログファイルパスを変数に保存するよりも、独自のロギングシステムを設定するより良い方法はありますか?

ベストアンサー1

あなたはこの質問の結果に最終的に満足していたようですが、私は別の提案をしました。

#!/bin/bash
LOG=/path/to/file.log    
DEBUG=0 # 0 = True, 1 = False
OUTPUT=$(scp file1 host@remote 2>&1)

# do 'whatever' if scp command succeeds:
if [ $? -eq 0 ];
then
    echo "Success"
elif [[ DEBUG -eq 0 ]]
    # else log both stdout/stderr to ${LOG} file and user
    # DEBUG - Use tee to display ${LOG} contents efficiently
    printf "$OUTPUT" | tee $LOG
else
    # Send output to $LOG
    printf "$OUTPUT" >> $LOG
fi

とにかく、デフォルトではSTDIN / STDOUTを変数にキャプチャし、成功すると「何でも」実行しますが、失敗した場合はSTDIN / STDOUTをリダイレクトします$LOG。また、フラグを使用すると同時にコンテンツを$DEBUG表示できます。tee$OUTPUT$LOG

また、整数比較の場合は、orの-eq代わりに使用する必要があります。===

おすすめ記事