シェルコマンドへの入力として大量のデータを渡す

シェルコマンドへの入力として大量のデータを渡す

パイプを介して動作するbashシェル(非対話型)を使用して、大量のデータをシェルコマンドに渡したいと思います。これまでは安定して動作できません。

たとえば、ここのドキュメントを使用すると、次のようになります。

(sed s/X//|base64 -d|lzcat|tar x) << EOF
XXQAAgAD//////////wAzG+wBunDDREwYD51KYXL50sahXmBTOGSine7WC0RATjpIrem5ygsQWKoZ
XwhPmkJAuCyqnO1KQAoFruXjSOsR3KJY+zHvzYFOgpl3ZJa+1+b0cB0w2vYzj53qplKMTjRkchPnr
XZ/nbloA=
EOF

ただし、大量のデータの場合、bashはコマンドに渡す前にすべてのデータをメモリにロードしようとするため、機能しません。

一方、ここでは文書なしで直接これを行うと、コマンドに直接渡す必要がありますが、シェルでは予測不可能な数の行をシェルコマンドとして解釈するようです。

(sed s/X//|base64 -d|lzcat|tar x)
XXQAAgAD//////////wAzG+wBunDDREwYD51KYXL50sahXmBTOGSine7WC0RATjpIrem5ygsQWKoZ
XwhPmkJAuCyqnO1KQAoFruXjSOsR3KJY+zHvzYFOgpl3ZJa+1+b0cB0w2vYzj53qplKMTjRkchPnr
XZ/nbloA=

私はこれが非対話型シェルが入力をバッファリングする方法に関連していると思います。

データを渡すシェルに戻る必要はないので、動作を予測できれば、後者のような解決策が実現可能です。

ベストアンサー1

ギガバイトサイズのシェルスクリプトを持っているという考えは私には言わないようです。だからデータを別のファイルに入れてください。

1つのファイルしか使用しない場合:シェルにこのデータを無視するように指示します。ファイルの末尾に置く.シェルは、ファイルが終わるまでexit(少なくとも)読み取られません。bash

外部コマンドを使用してファイルからデータを抽出し、それを期待されるコマンドに渡します。

#! /bin/bash

do_something_with_the_data () {
        wc
}

test -f "$0" || exit 3

awk '/^DATABLOCK-1$/ { run=1; next; }; run==0 { next; }; '\
'$0=="" { exit; }; { print; }' "$0" |
        do_something_with_the_data

awk '/^DATABLOCK-2$/ { run=1; next; }; run==0 { next; }; '\
'$0=="" { exit; }; { print; }' "$0" |
        do_something_with_the_data

exit 0

DATABLOCK-1
foo bar baz

DATABLOCK-2
x
y
z

おすすめ記事