Linuxのシェルスクリプトでログ出力する方法についてです!
リダイレクトとteeコマンドで、サクッとログ出力しましょう!
- リダイレクトでログを上書き出力する
- リダイレクトでログを追記で出力する
- まとめてログ出力
- カッコ内とカッコにログ出力すると……?
- コンソール上とログ出力どっちもしたい!
- コンソール上と追記でログ出力どっちも!
- ログ出力を処理ブロックまとめてと、コマンド別出力どっちもしたい
- あとがき
リダイレクトでログを上書き出力する
このようにすると、コマンドの実行結果を出力する代わりにファイルに出力することができます。
echo abc > log
この場合、「log」というファイルが作成され、
abc
という内容が書かれています。
既にファイルがある場合は、上書きされてしまうので、出力するファイルパスには気をつけましょう。
リダイレクトでログを追記で出力する
このようにすると、今度は「log」というファイルに追記で出力されます。
echo abc >> log
これを実行すると
abc
となります。
もう1度実行すると
abc abc
となります。
まとめてログ出力
かっこでくくった処理に対して、リダイレクトすると、まとめてログ出力することができます。
{ echo abc echo ded } >> log
このようにしたとき、logの中身は
abc def
となります。
カッコ内とカッコにログ出力すると……?
今までのを見ていくと
「じゃあカッコの中で出力と、カッコに対して出力を同時にやったらどうなるの?」
という疑問が湧きます。
{ echo abc >> inner echo ded >> inner } >> log
こんな感じですね。
結果的には、カッコに対して(log)には何も出力されません。
そして、カッコの中のログ(innner)の中身が
abc def
となります。
恐らくカッコの中のリダイレクトの時点で、出力済み状態となってしまうのだと思います。
欲張って両方書いちゃった場合は気をつけましょう。
コンソール上とログ出力どっちもしたい!
「コンソール上に結果は表示したいが、ログファイルとしても出力したいんだが」
という場合、「tee」というコマンドを使います。
こんな感じ。
echo abc | tee log
このように、対象のコマンドにパイプで「tee」を実行すれば……
コンソールには
abc
そして出力ファイル(log)にも
abc
と出力されます!
ただしこの場合、ファイルは上書きで出力されます。
コンソール上と追記でログ出力どっちも!
「どっちもできるのはいいけど、追記がいいんじゃ!」
という場合、teeにオプションをつけましょう。
echo abc | tee -a log
- これでコンソールへの出力はされる
- ファイルには追記で出力される
が叶います。
ログ出力を処理ブロックまとめてと、コマンド別出力どっちもしたい
リダイレクトでログ出力する説明で、こんなのをやりましたね。
{ echo abc >> inner echo ded >> inner } >> log
これだと結果は、カッコ内のものしか出力されませんでしたね。
ということで、両方出力するには!?
こうします。
{ echo abc | tee -a inner echo def | tee -a inner } >> log
これでカッコ内とカッコに対して、両方に出力されます!
なんだったらコンソール上にも出力されます!
あとがき
Linuxのシェルスクリプトでログ出力する方法についてでした!
リダイレクトは、Windowsのバッチファイルと同じですよね。
しかしteeは調べて初めて知ったので、ちょっと「おぉ!」ってなりましたね。
シェルスクリプトをデバッグする際などにお役立てくださいませ!