ファイルから行を読み取り、各行を処理するスクリプトがあります。 Ctrl + Cを押してスクリプトがすべての行を読み取ることができなくても、後処理を実行できるように「後処理」を実行できることを願っています。これを達成するために、次の2つのことを行いたいと思います。
- 後でそのファイルからポスト処理をファイルにリダイレクトしますが、何が起こっているのかを確認したいので、「tee」にリダイレクトしたいと思います。
- 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
後処理機能では/を無視する必要があります^C
。SIGINT
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