Bashのユーティリティの連鎖呼び出しのパラメータ化

Bashのユーティリティの連鎖呼び出しのパラメータ化

私はstdinからデータ列を読み取り、それを処理(平滑化効果を適用)してからstdoutに出力するBashシェルで使用されるブラックボックスUNIXプログラムを持っています。たとえば、UNIXパイプを介して使用します。

generate | smooth | plot  

さらにスムーズにするには、スムージングを繰り返してBashコマンドラインから呼び出すことができます。

generate | smooth | smooth | plot   

でも

generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot

これはますます不快になりました。smooth出力をsmooth新しいインスタンスに複数回パイプできるようにするBashラッパーを作成したいと思います。

generate | newsmooth 5 | plot

変える

generate | smooth | smooth | smooth | smooth | smooth | plot

私の最初の試みは、Bashスクリプトを使用して現在のディレクトリに一時ファイルを作成して削除することでしたが、書き込みアクセス権があるディレクトリにない場合は見苦しく、文書が破損してもゴミも残ります。

このプログラムにはパラメータはありませんsmooth

呼び出し回数をパラメータ化するために、これらのプログラムを「ラップ」するよりエレガントな方法はありますか?

答え1

再帰関数でラップできます。

smooth() {
  if [[ $1 -gt 1 ]]; then # add another call to function
    command smooth | smooth $(($1 - 1)) 
  else
    command smooth # no further 
  fi
}

次のように使用できます。

generate | smooth 5 | plot

これは次のとおりです。

generate | smooth | smooth | smooth | smooth | smooth | plot

答え2

必要なコマンド数だけカンマを入力できる場合は、smoothシェルのカンマ区切りの中括弧拡張を利用できます。

TL;DR

サンプルケースの完全なコマンドラインは次のとおりです。

generate | eval 'smooth |'{,,,,} plot

メモ:

  • 繰り返し回数を増減するには、カンマを追加または削除してください。smooth |
  • 中かっこ拡張で生成された最後の文字列に含まれているため、|以前はありません。plotsmooth |
  • smooth開かれた中括弧の前に引用された固定セクションに適切に囲まれている限り、引数を指定することもできます。みんなコマンドの繰り返し

どのように動作しますか?

カンマ区切りの中括弧拡張を使用すると、それぞれ指定された固定部分と指定された可変部分で構成される文字列を動的に生成できます。a{b,c,d}Produceなど、表示されている変数部分と同じ数の文字列を生成しますab ac ad

ここでの秘訣はリストを作りたいなら可変部分の場合、つまり中括弧内にカンマだけがある場合、中括弧拡張は固定部分のコピーのみを生成します。たとえば、

smooth{,,,,}

生産します:

smooth smooth smooth smooth smooth

気づく4カンマは5つのsmooth文字列を生成します。これが中かっこ拡張が機能する方法です。カンマに1を加えただけの文字列を生成します。

もちろん、あなたの場合はすべて|の区切りが必要なので、smooth固定セクションに追加するだけです。ただし、シェルを取得するには正しく引用する必要があります。いいえすぐに説明してください。それは:

'smooth|'{,,,,}

生産します:

'smooth|' 'smooth|' 'smooth|' 'smooth|' 'smooth|'

固定部分は常に慎重に配置してくださいまもなく開いた中かっこの横にあります。つまり、と' の間にスペースはありません{

(また、固定セクションでシェル変数を拡張する必要がある場合は、単一引用符の代わりに二重引用符を使用して固定セクションを形成することもできます。特定のシェル特殊文字が二重引用符内に表示されるときに必要な追加のエスケープに注意してください。引用符付き文字列)。

eval この時点で、文字列を文字列に適用して、シェルが最終的にそれらをパイプされたコマンドとして解釈するようにする必要があります。

したがって、要約すると、サンプルケースの完全なコマンドラインは次のようになります。

generate | eval 'smooth |'{,,,,} plot

関連情報