
#!/bin/bash --
echo "$$"
LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile
echo end of script
QUIT
送信信号を使用すると、Ctrl + \
次のような結果が出力されます。
# ./script.sh
6739
^\./script.sh: line 5: 6740 Quit LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile
end of script
期待どおりに終了sed
し、コアダンプが発生しますが、スクリプトは続行されます。これが予想される動作ですか? andを使用していbash
ますが、ash
not dash
orを使用してこれが私に起こりましたksh93
。
答え1
はい、bash
無視してくださいSIGQUIT
。から引用手動(強調):
3.7.6 信号
Bashがインタラクティブのときにトラップなしで無視され
SIGTERM
(kill 0
インタラクティブシェルが終了しないように)、キャプチャされて処理されます(組み込みコマンドが中断されるようにSIGINT
)。wait
Bashがそれを受け取ると、SIGINT
実行ループから外れます。すべての場合において、Bashは無視します。SIGQUIT
。ジョブ制御が適用される場合、Bashは、およびSIGTTIN
をSIGTTOU
無視しますSIGTSTP
。
これは非標準の動作であり、他のほとんどのシェルではこれを行いません。
説得力がないと思われる場合は、ソースコードを見てください:shell_initialize()
- > initialize_signals(0)
- > initialize_shell_signals()
- >set_signal_handler (SIGQUIT, SIG_IGN)
無条件で呼び出されますmain()
。