2016-04-21 166 views
1

我一直在尋找解決寫入一系列連接到stdout的非常大的流的問題,然後再次從stdin中讀取這些流,將流拆分成它們的原始部分。我面臨的限制是,我無法在磁盤上創建任何臨時文件。連接到標準輸出,然後在標準輸入分割 - 這可能嗎?

我試着使用unxz --singe-stream選項,但是這並沒有我期待的效果。

爲了證明什麼,我想實現的,我有兩個腳本:

[email protected]:~# cat test-source.sh 
#!/bin/bash 

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

然後將以上第一個腳本管道成旨在扭轉效果,第二腳本:

[email protected]:~# cat test-sink.sh 
#!/bin/bash 

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

以上腳本預計輸出以下內容:

one 
two 
three 

而是我看到以下內容:

[email protected]:~# ./test-source.sh | ./test-sink.sh 
one 
unxz: (stdin): File format not recognized 
unxz: (stdin): File format not recognized 

上述xz只是我試過的一個選項,我願意接受其他建議。 gzip想立刻解壓整個流,我需要保留流之間的界限。

據我所知,焦油不好,因爲它不能接受一個流從標準輸入焦油。

有沒有其他工具可以用來編寫腳本?

回答

0

鑑於你的源腳本,腳本,如果我跑:

sh test-source.sh | unxz 

我得到的輸出:

one 
two 
three 

這似乎是你要求的行爲。您嘗試多次運行unxz --single-stream不起作用,因爲第一個unxz進程會消耗所有輸入,即使它只提取第一個流。

+0

這不是我尋找的行爲不,因此錯誤「unxz:(stdin):文件格式無法識別」。 我需要在最後發生的事情是,在源端將三個獨立的流合併在一起,必須在sink端被解複用爲三個獨立的流,在那裏它們可以通過命令進行處理。 現在發生的情況是,第一次調用unxz會正確處理第一個流,然後吞下第二個和第三個流,導致數據被傳遞到錯誤的地方。 –

+0

這似乎正好實現了您在輸出方面描述的內容,並且我在該答案中解釋了該錯誤消息的原因。你能否闡述(在你的問題中,理想情況下)你想要的行爲與這裏提出的行爲有什麼不同? – larsks

+1

我收到的錯誤信息很好理解,我將它們包含的原因是爲了證明我看到的不良行爲。 正如原始問題所述,我正在尋求解決寫入一系列連接到標準輸出的非常大的流,然後再次從標準輸入讀取這些流,將流分成它們的原始部分的問題。 –

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

作爲替代工具,我想出了tarmux,它提供了一個用C語言編寫的基於libarchive提供的tar文件格式的多路複用器/解複用器。

測試腳本現在這個樣子:

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

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

而且這樣的:

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

tardemux 
tardemux 
tardemux 

tardemux的輸出可以輸送到其他命令,文件不會碰到磁盤。

相關問題