質問: ### 質問事項 指定のディレクトリ (target_dir) にあるlogファイルから "Error" という文字列が含まれる行を抽出してきたファイル (error.log) を作り、このファイルが空なら "OK"、空でないなら "NG" というスクリプトを作っています。bashで`set -e`を付けていると、if文の部分がうまく動きません。ファイルが空でない場合はきちんと動くのですが、ファイルが空の場合の処理が実行されないのです (実行すると何も表示されずに終わる)。何がおかしいのかわからず質問いたしました。よろしくお願いいたします。 ### 該当のソースコード ``` #!/usr/bin/env bash set -e grep Error ./target_dir/*.log > error.log if [ -s error.log ]; then echo "NG" else echo "OK" fi ``` ### 試したこと grepでerror.logを作らず、単にerror.logを用意するとうまくいきます。 ### bashのバージョン ``` $ bash --version GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. ```
回答: > > bashでset -eを付けていると、if文の部分がうまく動きません。 > > > はい、`grep`の終了コードは、**見つからなかった場合**に1となりますので(man)、`set -e`の効果でシェルスクリプトが終了してしまいます。 `grep Error ./target_dir/*.log > error.log || :`のように、失敗しても行全体では0を返すようにしておきましょう。