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代わりに使用する必要があります。===

答え2

出力を記録したいようです。後ろにコマンドを実行しましたが不可能です。

コマンドの出力を無条件に記録するには、scpコマンド自体と同じ行にリダイレクト演算子を含めます。つまり、次のようになります。

&>"${LOG}" scp file1 host@remote

コマンドが失敗した場合(コードで実行しようとしているように)、ログ出力を保存したい場合は、出力を一時ファイルにリダイレクトしてからファイルを目的の場所に移動するのはどうですか?次のように見えます。

#!/bin/bash

# Set path the real log file location
LOG=/path/to/file.log

# Create a temporary file to capture standard output and standard error
TEMPLOG="$(mktemp)"

# Run command and redirect output to temporary logfile
2>"${TEMPLOG}" scp file1 host@remote

# do 'whatever' if scp command succeeds:
if [ $? = 0 ];
then
    echo 'Command successful!'

# else log both stdout/stderr to ${LOG} file
else
    # Move the log file from the temporary location to the desired location
    mv "${TEMPLOG}" "${LOG}"

    # DEBUG - print contents of ${LOG} var for testing purposes
    printf "${LOG}"
fi

関連情報