连接到stdout,然后拆分stdin - 这可能吗?

时间:2016-04-21 15:08:25

标签: shell concatenation

我正在寻找解决将一系列非常大的流连接到stdout,然后再次从stdin读取这些流,将流分成原始部分的问题。我面临的限制是我无法在磁盘上创建任何临时文件。

我尝试使用unxz --singe-stream选项,但这没有我期望的效果。

为了演示我想要实现的目标,我有两个脚本:

user@localhost:~# cat test-source.sh 
#!/bin/bash

echo "one" | xz
echo "two" | xz
echo "three" | xz

然后将上面的第一个脚本传送到第二个脚本,该脚本旨在反转效果:

user@localhost:~# cat test-sink.sh 
#!/bin/bash

unxz --single-stream
unxz --single-stream
unxz --single-stream

上述脚本应输出以下内容:

one
two
three

相反,我看到以下内容:

user@localhost:~# ./test-source.sh | ./test-sink.sh 
one
unxz: (stdin): File format not recognized
unxz: (stdin): File format not recognized

上面的xz只是我试过的一个选项,我对其他建议持开放态度。 gzip想要立即解压缩整个流,我需要保留流之间的界限。

我理解tar不好,因为它无法接受来自stdin的tar流。

还有其他工具可用于编写脚本吗?

3 个答案:

答案 0 :(得分:2)

我不知道这是否能解决你的问题(因为它需要安装一些软件,考虑到这个问题的性质可能不是一个选项),但是你有所启发正是你所描述的:

您可以迭代生成来自多个块的输出流,如:

echo "one" | xz | mux
echo "two" | xz | mux
echo "three" | xz | mux

然后将其传递给另一侧的demux命令以提取单个组件。例如,一个简单的例子:

$ (
  echo "one" | xz | mux
  echo "two" | xz | mux
  echo "three" | xz | mux
  ) | demux -v
INFO:demux:processing stream 0 to stream-0.out
INFO:demux:processing stream 1 to stream-1.out
INFO:demux:processing stream 2 to stream-2.out

这将获取输入流并在当前目录中生成三个文件。

它还可以执行其他操作,例如可选地添加sha256哈希 到每个流进行数据完整性验证。

答案 1 :(得分:1)

作为替代工具,我提出了tarmux,它提供了一个用C语言编写的多路复用器/解复用器,它基于libarchive提供的tar文件格式。

现在,测试脚本如下所示:

'this is <div>#an</div> message'

而且:

Little-Net:trunk minfrin$ cat ./test-source.sh 
#!/bin/bash

echo "one" | tarmux
echo "two" | tarmux
echo "three" | tarmux

tardemux的输出可以通过管道传输到其他命令中,文件也不会碰到磁盘。

答案 2 :(得分:0)

鉴于您的源脚本脚本,如果我运行:

sh test-source.sh | unxz

我得到了输出:

one
two
three

这似乎是你要求的行为。您多次运行unxz --single-stream的尝试不起作用,因为第一个unxz进程会消耗所有输入,即使它只提取第一个流。