shell scriptを入れ子にした場合のteeの挙動について調べました

 1. 概要

出力を分割できるteeはとても便利です。表示をしながらログファイルに出力する用途が一般的だと思います。shell script単体で処理をしている場合は問題になりませんが、shellを複数組み合わせて、大きな処理として実行する場合にteeがどのように機能するかが気になり、調べることをしました。

teeを利用して実行ログをファイルに保管することを良く実施します。このような処理をすでに組み込んでいるshell全体を更にteeを利用して実行ログをファイル保管するとどのようになるのか調べてみました。結果は、両方の機能が実行されることになり、片方の機能が無効になることはありませんでした。その内容を記述します。

2. 詳細

単純なshellをtest1.shで作成します。

#!/bin/bash
echo "test1" | tee test1.log

実行すると、test1.logが出力されて、中身は下記内容になります。
test1

同じ処理をtest2.sh, test3.sh作成します。更に、test.shを下記内容で作成します。
test.shを実行することで入れ子構造でのteeの動作を確認できます。

#!/bin/bash
test(){
sh test1.sh
sh test2.sh
sh test3.sh
}
test | tee test.log

それでは、test.shを実行します。
まず、test.logの内容は以下のようになります。
$ test.sh
test1
test2
test3

また、test1.log, test2.log, test3.logも作成されて、中身も想定した内容になります。

3.所見

入れ子(ネスティング)した場合の動作は、動かした場合と異なることがあります。shell内で、入れ子のshellの呼び出し方法にも影響します。今回はshで起動して別プロセスで試してみたので参考にしてください。

どのようなことでも実際に試験をして確かめることは大切なことだと思います。予測しない結果になることもあり、理論的に整理をしたことが間違いであったことに気がつくこともあります。しかし、実行した結果だけで判断することも問題があり、試験のミスもあるのが理由です。その意味で、過程を立てて、実際に試して、結果を見て判断するのが良いのでしょう。

4.追加

私はshell programmingを利用します。その理由は簡単で早く結果を出せる仕組みであり、スクリプトに定義することで繰り返し利用できるからです。Linuxの管理を行うとプログラミングよりもshell sxriptの利用頻度が高くなる傾向にあると思っています。

bash shell ( Ubuntu/LinuxMint は dash shell )は標準品であり、どこでも実行できます。Linux環境であるならばコマンドにご完成があり、よほど異なる環境でない限り、実行がエラになることはありません。

bash shellではLinuxの様々な組み込みコマンドを利用できます。このコマンドは信頼性が高く、バグはほとんどありません。結果が異なる場合は、たいていの場合、自分のミスです。信頼性の高いツール群を利用して、緊急性の高い処理を実現するのがshell protrammingと言えます。

実行速度の面は、普通の処理ならばプログラム言語と余り変わりません。もちろん、熟考されたロジックを持つプログラムには勝てませんが、課題発見から結果出力までの時間の速さはshell programmingが一番であると思いっています。

参考

[本ブログ内参照]

コメント