むかしむかしあるところに、たいそうシンプルなログ出力を行うシェルがあったそうな。
command.sh
#!/bin/sh
command 1>>log.log 2>>error.log
ところがシェルスクリプトで時刻だのなんだの、細かいエラーログを出力する必要がでてきたので、もう少し頑張って頂きたい。
しかしエラー出力の加工ってどうやるんだろうか。
やれやれ。僕は検索した。
シェルの入出力制御あれこれ
[bash]時刻付きでログファイルに出力する
awkを使ってみる
なるほどawk
というコマンドに渡せばいいのだな。
方法は他にもあるようだけど、とりあえずこれでやってみよう。
こうやってこうじゃ。
($0
変数にエラーメッセージが渡ってくる)
command.sh
#!/bin/sh
command 1>>log.log 2> >(awk '{printf("[ERROR!!!]\n%s\n%s\n",strftime("%Y/%m/%d %H:%M:%S"),$0)}' >>error.log)
と、長々と書いて実行!!!
syntax error unexpected token near `>'
はいエラー!!!
でもこれは欲しいエラー(コマンド実行エラー)ではなくシェルの文法エラーである……。
原因
お分かりだろうか……
command.sh
#!/bin/sh
command 1>>log.log 2> >(awk '{printf("[ERROR!!!]\n%s\n%s\n",strftime("%Y/%m/%d %H:%M:%S"),$0)}' >>error.log)
#!/bin/sh ←こいつを
#!/bin/bash ←こうじゃ
完成
command.sh
#!/bin/bash
command 1>>log.log 2> >(awk '{printf("[ERROR!!!]\n%s\n%s\n",strftime("%Y/%m/%d %H:%M:%S"),$0)}' >>error.log)
すさまじく時間を浪費してしまった。
今回使った記法はbashの拡張記法であるところ、shを宣言してしまいインタプリタが解釈出来なかったようです。
テスト
command.sh
#!/bin/bash
peropero 1>>log.log 2> >(awk '{printf("[ERROR!!!]\n%s\n%s\n",strftime("%Y/%m/%d %H:%M:%S"),$0)}' >>error.log)
出力結果
error.log
[ERROR!!!]
2018/09/27 10:33:59
No manual entry for peropero
これでよし。