다음 요구 사항에 따라 echo와 함께 tee 명령을 사용하는 방법은 무엇입니까?

다음 요구 사항에 따라 echo와 함께 tee 명령을 사용하는 방법은 무엇입니까?

명령 및 로그 파일 이름이 포함된 변수를 추가하면 변수 내용이 인쇄되기 tee때문에 예상한 결과가 제공되지 않습니다 .echo

다음은 파일 내용, 실제 출력 및 예상 결과입니다.

쉘 스크립트 내용:

#!/bin/bash

log="2>&1 | tee -a report.txt"

echo ""
echo '***************-:START OF THE REPORT:-***********' $log

스크립트를 실행한 후.

console op:
***************-:START OF THE REPORT:-*********** 2>&1 | tee -a report.txt

예상되는-

console op:
***************-:START OF THE REPORT:-***********

report.txt file content:
***************-:START OF THE REPORT:-***********

또한 각 echo 명령 끝에 명령을 하드코딩 하고 싶지 않으므로 변수에는 명령과 파일 이름이 $log포함되어야 합니다 .teetee

답변1

tee각각에 태그를 지정하고 싶지 않기 때문에 실제 파이프에 태그를 지정하고 로그 메시지 끝에 태그를 지정하는 이 특이한 방법을 사용하고 싶다고 가정합니다 echo.

음, 다음과 같이 할 수도 있습니다.

logfile='report.txt'

log () {
    if [ -z "$1" ]; then
        cat
    else
        printf '%s\n' "$@" 
    fi | tee -a "$logfile"
}

log "some message"
log "some other message"
log "multi" "line" "output"

{
    cat <<LETTER
Dear Sir,

It has come to my attention, that a whole slew of things may be
collected and sent to the same destination, just by using a single
pipe. Just use { ... } | destination

Sincerely, $LOGNAME
LETTER

    cat <<THE_PS
PS.
Here's the output of "ls -l":
THE_PS

    ls -l

    echo "LOL"

} | log

즉, 다루기 힘든 tee명령을 입력하기 쉬운 이름의 간단한 쉘 함수로 감싸고 출력을 파이프로 연결하면 됩니다.

이 예에서 함수는 명령줄에 제공된 데이터를 출력하거나 명령줄 인수가 아닌 경우 표준 입력에서 읽기로 전환하는 데 log사용됩니다 .printf

당신은 사용할 수도 있습니다

./your_original_script_without_special_logging 2>&1 | log

답변2

그들은 당신이 사용하도록 허용

echo '***************-:START OF THE REPORT:-***********' $log

$logline은 마치 콘솔에 라인을 입력한 것처럼 보이지 않고 라인의 내용을 명령줄에 반영합니다 .

선이 예상대로 작동하도록 하려면 또는 를 사용할 수 있습니다 eval.

eval echo '***************-:START OF THE REPORT:-***********' $log

답변3

실제로 명령을 마스크하는 함수를 사용해야 합니다 echo.

echo ()
{
    builtin echo "$@" | tee -a report.txt
}

그러면 다음과 같이 할 수 있습니다:

echo ""
echo '***************-:START OF THE REPORT:-***********'

tee명령 끝에 하드코드를 작성하거나 다른 작업을 수행할 필요가 없습니다 echo.

관련 정보