我有啓動腳本,它調用產生大量輸出的命令。爲了保持空間我gzip壓縮輸出:是否有可能在bash中完成通過gzip優雅傳輸的命令?
#!/bin/bash
my_command 2>&1 | tee >(gzip --stdout > "1.log.gz")
可悲的是,當我按下Ctrl鍵+Ç,gzip
突然停止和壓縮日誌被損壞。有沒有辦法完成命令優雅地獲得有效的gz?
我有啓動腳本,它調用產生大量輸出的命令。爲了保持空間我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")
如果您將STDOUT和STDERR都重定向到/ dev/null,那麼tee會讀什麼?而STDOUT確實很重要,我只是想將它壓縮。 –
事實上,我也無法用「是」來重現問題。也許是因爲這個命令應該設置信號?如果用循環中打印'y'的shell腳本替換'yes',則會重現問題。儘管如此,使用FIFO管道的竅門有用,謝謝。 –