トラップとexecを使用してbashから出力をティーにリダイレクトする

トラップとexecを使用してbashから出力をティーにリダイレクトする

ファイルから行を読み取り、各行を処理するスクリプトがあります。 Ctrl + Cを押してスクリプトがすべての行を読み取ることができなくても、後処理を実行できるように「後処理」を実行できることを願っています。これを達成するために、次の2つのことを行いたいと思います。

  1. 後でそのファイルからポスト処理をファイルにリダイレクトしますが、何が起こっているのかを確認したいので、「tee」にリダイレクトしたいと思います。
  2. Ctrl+C をキャプチャし、そこで後処理します。

私は1〜2つを動作させることができましたが、どちらも動作しませんでした。

#!/bin/bash

# 2. Either this works 
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
    echo "** Trapped CTRL-C"
}

# 1. Or this works    
LOGFILE=/tmp/${FILE}.tee
rm ${LOGFILE}
exec > >(tee ${LOGFILE}) 2>&1

function post_process() {
    # use ${LOGFILE}
}

egrep "(${URL_PATH})" ${FILE} |
    while read LINE ; do
        #...
    done

post_process

ベストアンサー1

後処理機能では/を無視する必要があります^CSIGINT

preprocess(){
   yes baa
}
postprocess(){
   sed 's/a/z/g'
}
preprocess | { trap '' INT; postprocess; sleep 1; echo DONE; }

パイプラインを実行してキーを押すと、^Cパイプpreprocessラインは終了しますが、postprocess生成されたすべての出力が消費されるまで実行され続けます。preprocess

trap '' INT(空の文字列をハンドラとして使用する)は、子SIGINTプロセスでも無視されます。なぜなら、シグナルが上位プロセスで処理されていても、 '^C' によってすべてtrap 'echo INT trapped' INTなどが終了するからです。sed

おすすめ記事