是否有可能在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 
+0

事实上,我也无法用“是”来重现问题。也许是因为这个命令应该设置信号?如果用循环中打印'y'的shell脚本替换'yes',则会重现问题。尽管如此,使用FIFO管道的窍门有用,谢谢。 –

在你的榜样,你不能打破它安全,因为按Ctrl +çSTDOUT和压缩不能成功完成。 如果STDOUT不事尝试使用

my_command &>/dev/null | tee >(gzip > "1.log.gz")

+0

如果您将STDOUT和STDERR都重定向到/ dev/null,那么tee会读什么?而STDOUT确实很重要,我只是想将它压缩。 –