6

次のbashスクリプトがあります:

tail -F -n0 /private/var/log/system.log | while read line 
do
    if [ ! `echo $line | grep -c 'launchd'` -eq 0 ]; then
        echo 'launchd message'
        exit 0
    fi
done

何らかの理由で、エコーが発生しlaunchd message、5 秒間待機してから終了します。

なぜこれが起こっているのですか?また、エコーが発生した直後に終了させるにはどうすればよいlaunchd messageですか?

4

3 に答える 3

9

パイプを使用しているため、whileループはサブシェルで実行されています。代わりにメインシェルで実行してください。

#!/bin/bash

while ...
do
   ...
done < <(tail ...)
于 2010-10-28T22:31:00.213 に答える
3

Ignacioが示すようにtail | while、サブシェルを作成します。遅延は、すべてが閉じる前に次の行がログファイルに書き込まれるのを待っているためです。

exitプロセス置換を使用したくない場合は、コマンドの直前に次の行を追加できます。

kill -SIGPIPE $$

残念ながら、このメソッドを使用して終了コードを制御する方法はわかりません。128 + 13(の信号番号)である141になりますSIGPIPE

デーモンの起動を、起動した別のデーモンに依存させようとしている場合は、おそらくそれを行うためのより良い方法があります。

ちなみに、実際にBashスクリプトを作成している場合(<()プロセス置換を使用する必要があります)、次のifように作成できますif [[ $line == *launchd* ]]

于 2010-10-29T01:22:24.180 に答える