날짜 및 시간 로깅을 위한 stderr stdout도 tty에 출력을 표시하지만 날짜 및 시간은 표시하지 않습니다.

날짜 및 시간 로깅을 위한 stderr stdout도 tty에 출력을 표시하지만 날짜 및 시간은 표시하지 않습니다.

함수 내에서 몇 가지 명령을 실행하고 있습니다. 날짜와 시간을 추가하여 이 함수의 각 명령 출력을 기록하고 싶습니다. 그런데 실행시 터미널에서는 날짜나 시간 없이 메인 일반 출력만 표시하고 싶습니다.

그렇다면 이와 같은 함수를 exec 3>&1 1>>${log} 2>&1통해 이 모든 것을 어떻게 파이프합니까?adddate

./script | adddate >>$log이렇게 하면 date각 줄의 로그 출력을 얻을 수 있지만 동시에 터미널에 출력을 표시할 수도 있습니다.

나는 tty에 날짜와 시간을 표시하고 싶지 않고 단지 로그에 저장하고 싶습니다. 사용자가 언제든지 전달할 수 있는 잘못된 인수 등을 캡처하고 동시에 tty에서 스크립트를 실행하는 사용자에게 출력을 표시하고 싶기 때문에 이 작업을 수행하고 있습니다.

지금까지 나는 다음을 수행했습니다.

#!/usr/bin/env bash
log=logs.txt
exec 3>&1 1>>${log} 2>&1 ## works but without date

그런 다음 아래와 같은 것을 시도했습니다. 올바르게 수행하는 방법을 잘 모르겠습니다.

3>$1 1>> | adddate ${log} 2>&1 ###(!) doesnt work
exec 3>&1 | adddate 1>> ${log} 2>&1 ###(!) doesnt work

adddate, main기능은 다음과 같습니다.

adddate() {
    while IFS= read -r line; do
        printf "%s %s\n" "$(date)" "$line";
    done
}

main()
{

case $arg in
        --version)
                [[ "$arg2" == "" ]] && { --version; } || { error; } ;;

        build)
                [[ "$arg2" == "oneshot"  ]] && {
                        build oneshot; } || {
                        build;
                         } ;;
        update)
                [[ "$arg2" == "" ]] && { update; } || { error; } ;;
        *)
                error
esac

}

arg=$1;
arg2=$2;
shift;

main | tee /dev/fd/3; ## so that it goes to tty, not sure if there is other better way?!?

main즉, 로그는 다음과 같아야 합니다. 각 명령에 대해 함수와 유사한 명령 출력 전에 날짜와 시간이 로그에 기록되어야 합니다.

main()
{
   printf "Hello\n";
   printf "there!\n";
}

로그아웃은 다음과 같아야 합니다:

Mon Jun 17 20:00:02 JST 2019 Hello
Mon Jun 17 20:00:02 JST 2019 there!

tty는 로그를 표시하지 않고 기본 출력만 표시해야 합니다. 예를 들면 다음과 같습니다.

Hello
there!

답변1

누군가가 이것을 개선할 수 있기를 바랍니다.

나는 처음에 이와 같은 명령을 사용합니다 ts.moreutils

#!/usr/bin/env bash

command -v ts > /dev/null 2>&1 [[ $? -ne 0 ]] && { sudo apt install moreutils -y; };

log="./testlog.txt"
comm()
{
        printf "Hi\n";
        echo "here is a wrong command"
        csdf;
        echo "bye"
}

exec 3>&1 1>>${log} 2>&1;
comm | tee /dev/fd/3 | ts;

그리고 그렇지 않습니다 ts:

#!/usr/bin/env bash

log="./testlog.txt"
comm()
{
        printf "Hi\n";
        echo "here is a wrong command"
        csdf;
        echo "bye"
}
dddate() 
{
while IFS= read -r line; do
        printf '%s %s\n' "$(date)" "$line"
done
}

exec 3>&1 1>>${log} 2>&1;
comm | tee /dev/fd/3 | dddate;

로그 파일에서:

./test.sh: line 10: csdf: command not found
Mon Jul  8 12:23:44 UTC 2019 Hi,
Mon Jul  8 12:23:44 UTC 2019 here is a wrong command
Mon Jul  8 12:23:44 UTC 2019 thanks

터미널에서:

Hi,
here is a wrong command
thanks

관련 정보