Mysql 解释一下这个贝壳管魔法(…| tee>;(tail-c1>;$PULSE)| bzip2 |…)是如何工作的?

Mysql 解释一下这个贝壳管魔法(…| tee>;(tail-c1>;$PULSE)| bzip2 |…)是如何工作的?,mysql,bash,shell,pipe,io-redirection,Mysql,Bash,Shell,Pipe,Io Redirection,这里是(相关的30行bash代码突出显示) 这里简化了(s3是一个二进制文件,它流到对象存储)。点(…)是未张贴在此处的选项 PULSE=$(mktemp -t shield-pipe.XXXXX) trap "rm -f ${PULSE}" QUIT TERM INT set -o pipefail mysqldump ... | tee >(tail -c1 >$PULSE) | bzip2 | s3 stream ... 这到底是怎么回事?你能解释一下这个重定向和管道是如何

这里是(相关的30行
bash
代码突出显示)

这里简化了(
s3
是一个二进制文件,它流到对象存储)。点(…)是未张贴在此处的选项

PULSE=$(mktemp -t shield-pipe.XXXXX)
trap "rm -f ${PULSE}" QUIT TERM INT

set -o pipefail
mysqldump ... | tee >(tail -c1 >$PULSE) | bzip2 | s3 stream ...

这到底是怎么回事?你能解释一下这个重定向和管道是如何工作的吗?如何调试错误
mysqldump:write时出现错误32
。手动调用时(仅限)
mysqldump
不会出错。

棘手的部分是:

  • tee
    写入标准输出和文件
  • >(cmd)
    创建可写进程替换(一个模拟可写文件行为的命令)
这用于将
mysqldump
的输出有效地传输到另外两个命令中:
tail-c1
将最后一个字节打印到文件中,以及
bzip2
压缩流


正如伊尼安在评论中指出的那样,错误32来自一根断裂的管道。我猜这是由于s3流的终止(可能是超时?)导致管道中前面的命令失败。

错误32对应于管道破裂。看起来
bzip2
完成了,因此关闭了管道的一端进行读取,但是
mysqldump
一直在向管道写入数据