即使管道不接受输入,也会同时输出到管道和文件

Output to pipe and file at the same time even if pipe isn't accepting inputs

所以,我为 Cygwin 制作了一个脚本,它使用 Windows 的 ImageMagick 和 FFmpeg,但我不确定这里的结果是否也适用于 bash on Linux .所以,脚本所做的是我有一些卡通视频文件,我正在使用 Waifu2x 将图像增强和升级到 4K,然后使用 ImageMagick 将其通过管道传输到 FFmpeg,这也用于将其调整为 3840x2160 以防万一分辨率略有不同。这是我为这个例子写的一个小脚本,以简化它如何输出到 FFmpeg,因为真正的脚本非常冗长和复杂。

#!/bin/bash
fun(){
convert out.png JPG:-|tee "$outfile"
}
fun|ffmpeg -f image2pipe -r 60 -i - -c:v libx265 -movflags +faststart "$outputfile"

现在,我注意到如果 FFmpeg 编码失败,函数会继续但无法输出到 $outfile。我想要做的是让它能够输出到该文件以防编码失败,因为我还将所有图像写入 FFmpeg 的缓存文件夹到 运行 以防编码失败,但我也想同时写入 FFmpeg 的管道和文件。似乎正在发生的事情是,如果命令 tee 无法写入管道,它似乎拒绝写入文件。我不确定这种行为是否有意为之,and/or 它是否也在 Linux bash 上这样做。我怎样才能解决这个问题并让它写入文件,即使它不能写入管道,而是同时写入两者而不是写入文件并尝试将其读回管道?

您尝试过 tee 使用 -p 选项吗?即使 tee 无法写入其标准输出,它也会使 tee 继续写入,在您的情况下,这意味着如果 ffmpeg 失败,它应该能够应对。

fun() {
        convert out.png JPG:- | tee -p "$outfile"
}