lisz-works

プログラミングと興味を貴方に

Linuxのシェルスクリプトでリダイレクトとteeでログ出力

【スポンサーリンク】

Linuxペンギン

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は調べて初めて知ったので、ちょっと「おぉ!」ってなりましたね。

シェルスクリプトをデバッグする際などにお役立てくださいませ!