Bash

如何無限次擷取INT信號?

  • July 31, 2018

我正在通過基於 sed 的腳本輸出互動式命令 (ghci) 以添加一些顏色:

ghci | colorize.sh

colorize.sh類似的東西在哪裡:

#!/bin/bash
trap '' INT
sed '...some pattern...'

現在,如果我按 Ctrl-C,我只希望 ghci 接收它(它不會終止),並且我希望 sed 茁壯成長(或者可能重新啟動?)並且仍然處理 ghci 的輸出。

這個腳本不起作用,我不知道為什麼。

首先,讓我首先說這並不能回答您的問題,但我希望可以幫助澄清正在發生的事情。我懷疑你認為正在發生的事情可能並沒有真正發生。考慮這個簡單的例子:

# The 'writer' reads input from standard input and
# echos it to standard output.  It handles SIGINT by
# printing INT to standard output.
$ cat writer
#!/bin/bash
function foo() {
   echo "INT"
}

trap foo INT

while read x; do echo $x; done

# The 'reader' reads input from standard input and pipes what is
# read to 'sed', which converts it to upper case.  It ignores SIGINT.
# When it receives EOF on standard input, it writes "done".
$ cat reader
#!/bin/bash
trap '' INT
cat | sed -e 's/\(.*\)/\U\1/'
echo "done"

現在,當我同時執行兩者時,將輸出管道傳輸writerreader

$ ./writer | ./reader
hello
HELLO
^CINT
^CINT
^CINT
world
WORLD
^D
done
$

writer腳本從標準輸入讀取數據並寫入標準輸出——管道。腳本從標準輸入(管道)reader讀取並寫入標準輸出。當我點擊Ctrl-C時,會writer寫“INT”;忽略信號(reader多次)。最終,我進入Ctrl-D(EOF),然後writer終止。當reader接收到 EOF 時,它會終止並寫入“完成”。

請注意,reader忽略 SIGINT 不止一次,並且在處理 SIGINTsed時既不會中斷管道也不會中斷。writer

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