パイプラインチェーンで通常のコマンドのようにbash機能をどのように使用できますか?

パイプラインチェーンで通常のコマンドのようにbash機能をどのように使用できますか?

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これにより、関数自体が呼び出し元から呼び出さなくてもこのコードを実行できます。

おすすめ記事