関数内でいくつかのコマンドを実行しています。日付と時刻を追加して、この関数の各コマンド出力を記録したいと思います。ところで、実行時にターミナルでは日付や時間なしでメインの一般出力のみを表示したいと思います。
それでは、このような関数を使って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