如何使用管道命令忽略中断

如何使用管道命令忽略中断

在下面的管道命令链中,当使用 Ctrl-C 发送中断时,ping只要tee具有-i(忽略中断)标志,就能够在退出之前打印其摘要统计信息:

ping -D localhost 2>&1 | tee -a -i ping.log

但是,使用链中的另一个命令,ping不会打印 的摘要:

ping -D localhost 2>&1 | sed -u 's/^\[\([0-9]*\.[0-9]*\)\]\(.*$\)/echo "[`date -d @\1 +"%Y-%m-%d %H:%M:%S"`] \2"/e' | tee -a -i ping.log

怎样才能让上面打印摘要呢?

是否sed有忽略中断的选项?一般来说,如何使用管道命令优雅地处理中断?

答案1

ping -D localhost 2>&1 | (trap '' INT; exec sed -u 's/^\[\([0-9]*\.[0-9]*\)\]\(.*$\)/echo "[`date -d @\1 +"%Y-%m-%d %H:%M:%S"`] \2"/e') | tee -a -i ping.log

调用trap '' INT告诉 shell 忽略 SIGINT。它exec是可选的,但很高兴拥有,因为在陷阱之后不再需要子 shell 进程。

相关内容