是否有可能在bash中完成通过gzip优雅传输的命令?
问题描述:
我有启动脚本,它调用产生大量输出的命令。为了保持空间我gzip压缩输出:是否有可能在bash中完成通过gzip优雅传输的命令?
#!/bin/bash
my_command 2>&1 | tee >(gzip --stdout > "1.log.gz")
可悲的是,当我按下Ctrl键+Ç,gzip
突然停止和压缩日志被损坏。有没有办法完成命令优雅地获得有效的gz?
答
我无法重现你的问题,用“是”为你的程序的替代品 - 即
yes 2>&1 | tee >(gzip --stdout > "1.log.gz")
创造完美每次都有效的gz文件,所以想知道是否有其他的事情发生。
但是,您可以使用命名管道隔离命令的两个部分,如下所示;
# create a named pipe
mknod mypipe p
# start a background job that reads from the pipe
gzip --stdout > "1.log.gz" <mypipe &
# now do work -- ctrl-c only affect this process
my_command 2>&1 | tee mypipe
答
在你的榜样,你不能打破它安全,因为按Ctrl +ç将杀STDOUT
和压缩不能成功完成。 如果STDOUT
不事尝试使用
my_command &>/dev/null | tee >(gzip > "1.log.gz")
+0
如果您将STDOUT和STDERR都重定向到/ dev/null,那么tee会读什么?而STDOUT确实很重要,我只是想将它压缩。 –
事实上,我也无法用“是”来重现问题。也许是因为这个命令应该设置信号?如果用循环中打印'y'的shell脚本替换'yes',则会重现问题。尽管如此,使用FIFO管道的窍门有用,谢谢。 –