在下面的管道命令链中,当使用 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 进程。