stdoutおよび/またはstderrを変数に指定したパスにどのようにリダイレクトしますか?メモ:変数を上書きしたくありません。それ自体、変数で指定されたファイルにstd [xxx]を書きたいです。
たとえば、コマンドが失敗した場合は、失敗メッセージをscp
印刷するのではなく(失敗した場合はどうかわからない)、指定されたログファイルに出力する単純なスクリプトです。ログファイルのパスは変数に保存されます。stderr
stdout
$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