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

관련 정보