
Bashスクリプトの大容量ファイルに対して複数のコマンドを実行しています。進行状況を監視するには、pvコマンドを使用します。
コマンド例は次のとおりです。
cat $IN_FILE | pv -w 20 -s $(du -sb $IN_FILE | awk '{print $1}') | grep ...
スクリプトには、同様の構造を持つ複数のコマンドが含まれており、すべてのコマンドで同じプレフィックスを使用し続けるのではなく、進行状況監視部分の略語として関数を定義しました。 (注:fSizeおよびfSize Sum関数は、上記の例のduコマンド部分をラップします。ここで、fSizeSumは2つのファイルサイズの合計を返し、fSizeは1つのファイルサイズを返します。):
function prog()
{
local __size
if [[ $2 ]]
then
__size=$(fSizeSum $1 $2)
else
__size=$(fSize $1)
fi
echo "cat $1 | pv -w 20 -s ${__size}"
}
このアプローチは実際にコマンドをわずかに短縮します。これで、上記の例を次のように実行できます。
eval "$(prog $IN_FILE) | grep ..."
それでも私を悩ませているのは、各行を引用してevalを使用する必要があるということです。私はむしろ、 "prog"関数を通常のシェルコマンドのように使用したいと思います。つまり:
prog $IN_FILE | grep ...
これまで、パイプラインコマンドチェーンでプレフィックスとして機能するように関数を変更しようとしたすべての試みは失敗しました。
カスタムbashスクリプト機能を通常のbashコマンドのように実行し、パイプラインチェーンの前に配置する方法はありますか?関数を使用してこれを達成できない場合は、スクリプトでローカルエイリアスを定義するなど、これを達成する他の方法はありますか?
答え1
関数の定義で以下を置き換えることをお勧めします。
echo "cat $1 | pv -w 20 -s ${__size}"
のみ:
cat $1 | pv -w 20 -s ${__size}
eval
これにより、関数自体が呼び出し元から呼び出さなくてもこのコードを実行できます。
答え2
pv
ファイルを引数として渡したように動作するため、cat
-sを渡す必要もありません。
だからあなたはこれを行うことができます:
pv -w 20 $IN_FILE | grep ...