パイプを介して動作する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