LoginSignup
2
3

More than 3 years have passed since last update.

シェルスクリプトのエラー出力を整形したい

Last updated at Posted at 2018-09-27

むかしむかしあるところに、たいそうシンプルなログ出力を行うシェルがあったそうな。

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

これでよし。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3