Zsh

主 shell 退出後 >(process) 收到哪個信號?

  • May 11, 2018

這是一個 Zshell 問題,儘管 Bash,如果它具有 >(command) 語法(即這種類型的程序替換),也可以提示解決方案。這個非常基本的程式碼解釋了所有內容:

% 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 中,“exit 1”將關閉程序。

我的問題:可以用一些實際信號代替“退出”嗎?我已經嘗試過 PIPE、HUP、INT、TERM,但它們都不起作用。

您的程式碼並不能解釋全部。我不知道你想做什麼。但是,我可以回答你標題中的問題:>(…)當主 shell 退出時,程序沒有收到信號。它退出是因為它到達腳本的末尾,此時它執行EXIT陷阱,直到它執行exit內置。

如果您認為腳本被提前終止是因為您認為每個read -t 1呼叫會花費一秒鐘:不,它們不會,它們會在父級退出後立即返回。當父級退出時,read子shell 中的呼叫試圖從一個封閉的管道中讀取,並且底層read系統呼叫立即返回,沒有可用的數據。

引用自:https://unix.stackexchange.com/questions/443240