명령 및 로그 파일 이름이 포함된 변수를 추가하면 변수 내용이 인쇄되기 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
포함되어야 합니다 .tee
tee
답변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
$log
line은 마치 콘솔에 라인을 입력한 것처럼 보이지 않고 라인의 내용을 명령줄에 반영합니다 .
선이 예상대로 작동하도록 하려면 또는 를 사용할 수 있습니다 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
.