競合ログを含むディレクトリがあり、findコマンドに基づいてbashスクリプトで条件文を使用したいと思います。
ログファイルは次の形式で保存されます。
/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log
過去5分以内に修正された特定のアプリケーションの競合ログがある場合にのみ、ifステートメントがtrueを返すようにしたいと思います。find
私が使用するコマンドは次のとおりです。
find /var/log/crashes -name app-\*\.log -mmin -5
if
私はこれを声明に適切に含める方法を知りません。私の考えでは、これがうまくいくようです:
if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
service myapp restart
fi
私がよく理解していないいくつかのことがあります。
- 私は見たことがないフラグがある場合しかし、どのようなものを使うべきかはよくわかりません。
- そのディレクティブが必要ですか
test
、それともfindコマンドの結果を直接処理する必要がありますか、それともそれを使用してfind... | wc -l
行数を取得できますか? - この質問に100%答える必要はありませんが、
test
コマンドから返された戻りコードをテストするためのものですか?見えないか。内部stdout
/外部stderr
?ページを読みman
ましたが、いつ使用しtest
てデバッグするかはまだ明確ではありません。
ベストアンサー1
[
とtest
同義語([
requireを除く]
)なので、以下を使用したくありません[ test
。
[ -x /bin/cat ] && echo 'cat is executable'
test -x /bin/cat && echo 'cat is executable'
test
条件が true の場合は終了状態 0 を返し、そうでない場合は 0 以外の値を返します。これは実際に終了ステータスを確認するプログラムに置き換えることができます。ここで、0 は成功を意味し、0 以外の場合は失敗を意味します。
# echoes "command succeeded" because echo rarely fails
if /bin/echo hi; then echo 'command succeeded'; else echo 'command failed'; fi
# echoes "command failed" because rmdir requires an argument
if /bin/rmdir; then echo 'command succeeded'; else echo 'command failed'; fi
ただし、上記の例はすべてプログラムの終了状態のみをテストし、プログラムの出力を無視します。
の場合、find
出力が生成されるかどうかをテストする必要があります。-n
空でない文字列をテストします。
if [[ -n $(find /var/log/crashes -name "app-*.log" -mmin -5) ]]
then
service myapp restart
fi
help test
テストパラメータの完全なリストは、コマンドラインから呼び出すことで取得できますbash
。
これは、条件にスペースやその他の特殊なケースがある場合、より予測可能に動作するbash
(代わりにsh
)を使用すると機能します。[[ condition ]]
それ以外の場合は、通常を使用するのと同じです[ condition ]
。この例ではこれを使用し、[[ condition ]]
可能な限り使用します。
また、一般的に同様に動作しますが、入れ子になったコマンドをより良いに`command`
変更しました。$(command)