Bashが>(command)構文(プロセス置換など)を使用している場合は、ソリューションを提案することもできますが、これはZshellの問題です。この非常に基本的なコードはすべてを説明します。
% fun() {
setopt localtraps
trap "echo waiting >> /tmp/out; sleep 2; echo bye >> /tmp/out; exit 1;" EXIT
echo "My PID: $sysparams[pid]" # needs zsh/system module
repeat 1000; do
read -r -t 1 line
done
}
% exec {MYFD}> >(fun)
% exit
上記のタスクは、fun()がトラップを受信し、/ tmp / outに2つのメッセージが表示され、「exit 1」がプロセスを終了することです。
私の質問:「EXIT」を実際の信号に置き換えることはできますか? PIPE、HUP、INT、TERMを試してみましたが、何も機能しませんでした。
ベストアンサー1
あなたのコードがすべてを説明しているわけではありません。あなたが何をしたいのかわかりません。しかし、タイトルの質問に答えることができます。>(…)
メインシェルが終了すると、プロセスは信号を受信しません。組み込み関数が実行されるEXIT
までトラップを実行するスクリプトの終わりに達するため、終了します。exit
各呼び出しが1秒ほどかかると思うので、スクリプトが早く終了すると思うならread -t 1
、そうではありません。親プロセスが終了するとすぐに返されます。親プロセスが終了すると、read
サブシェルの呼び出しは閉じたパイプからデータを読み取ろうとし、デフォルトのread
システム呼び出しは利用可能なデータなしですぐに返されます。