![날짜 및 시간 로깅을 위한 stderr stdout도 tty에 출력을 표시하지만 날짜 및 시간은 표시하지 않습니다.](https://linux55.com/image/155563/%EB%82%A0%EC%A7%9C%20%EB%B0%8F%20%EC%8B%9C%EA%B0%84%20%EB%A1%9C%EA%B9%85%EC%9D%84%20%EC%9C%84%ED%95%9C%20stderr%20stdout%EB%8F%84%20tty%EC%97%90%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EC%A7%80%EB%A7%8C%20%EB%82%A0%EC%A7%9C%20%EB%B0%8F%20%EC%8B%9C%EA%B0%84%EC%9D%80%20%ED%91%9C%EC%8B%9C%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
함수 내에서 몇 가지 명령을 실행하고 있습니다. 날짜와 시간을 추가하여 이 함수의 각 명령 출력을 기록하고 싶습니다. 그런데 실행시 터미널에서는 날짜나 시간 없이 메인 일반 출력만 표시하고 싶습니다.
그렇다면 이와 같은 함수를 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