メインシェルが終了した後、>(プロセス)はどの信号を受け取りますか?

メインシェルが終了した後、>(プロセス)はどの信号を受け取りますか?

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システム呼び出しは利用可能なデータなしですぐに返されます。

答え2

bashそしてマニュアルによるとzsh、実際にtrapどんな信号でも送ることができます。

bash:

   trap [-lp] [[arg] sigspec ...]
          The command arg is to be read and executed when the shell receives signal(s) sigspec.  If arg is absent (and there is a single sigspec) or  -,  each  specified  signal  is
          reset  to  its  original disposition (the value it had upon entrance to the shell).  If arg is the null string the signal specified by each sigspec is ignored by the shell
          and by the commands it invokes.  If arg is not present and -p has been supplied, then the trap commands associated with each sigspec are displayed.  If  no  arguments  are
          supplied  or  if  only -p is given, trap prints the list of commands associated with each signal.  The -l option causes the shell to print a list of signal names and their
          corresponding numbers.  Each sigspec is either a signal name defined in <signal.h>, or a signal number.  Signal names are case insensitive and the SIG prefix is  optional.

zsh:

   trap [ arg ] [ sig ... ]
          arg is a series of commands (usually quoted to protect it from immediate evaluation by the shell) to be read and executed when the shell receives any of the signals speci-
          fied by one or more sig args.  Each sig can be given as a number, or as the name of a signal either with or without the string SIG in front (e.g. 1, HUP,  and  SIGHUP  are
          all the same signal).

関連情報