私は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 |
- 中かっこ拡張で生成された最後の文字列に含まれているため、
|
以前はありません。plot
smooth |
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