デモ出力を関数にパイプ

デモ出力を関数にパイプ

mosquitto_subを含むMQTTメッセージを受け取り、出力(2つの文字列)を関数にリダイレクトしたいと思います。

顧客:

mosquitto_pub -d -t hello/world/ -m "Alessio,base64"

サーバーにはbashプログラムがあります

サーバー:(有効)

function pipeTee(){
        tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee

ただし、別の関数にパイプしようとすると、プログラムは機能しません。

#!/bin/bash
function testPipe(){
        echo "va"
}

function pipeTee(){
        tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee | testPipe

クライアントのmosquitto_pub:

mosquitto_pub -d -t hello/world -m "Aless,base64"
Client mosqpub/1841-raspberryp sending CONNECT
Client mosqpub/1841-raspberryp received CONNACK
Client mosqpub/1841-raspberryp sending PUBLISH (d0, q0, r0, m1, 'hello/world', ... (12 bytes))
Client mosqpub/1841-raspberryp sending DISCONNECT

サーバーが機能しない場合:

pi@raspberrypi:~ $ ./mqtt_broker.sh 
va
^C

ファイルログが空です

ベストアンサー1

次のシェルスクリプトを考えてみましょう。

function thetee {
    tee data.out
}

function thepipe {
    echo "Hello!"
}

while true; do
    echo "Hi there!"
done | thetee | thepipe

echo "Done."

ここで、-loop はwhile「Hi There!」というテキストを含む無限行のジェネレータです。

実行してください:

$ sh script.sh
Hello!
Done.

次に、次の行数を確認してくださいdata.out

$ wc -l data.out
     274 data.out

再:

$ sh script.sh
Hello!
Done.

$ wc -l data.out
     236 data.out

質問:

  1. 無限ループは無限ではありません。
  2. 出力ラインの数は実行ごとに異なります。

理由:

  1. 私の例の関数はthepipe文字列をエコーし​​てから終了し、パイプが失敗します。パイプラインの最後のステップでは追加の入力を処理できず、ループは終了します。

  2. 作成される実際の行数は、data.outシェルがパイプを開始する速度と、関数が操作を実行thepipeおよび終了する速度によって異なります。

あなたの場合、これは早すぎるため、mosquitto_subデータジェネレータ()の入力が関数teeに到達できません。

解決策:

実際の生産thepipe機能入力を消費する:

function thepipe {
    echo "Hello!"
    cat
}

その後、私の例のコードは「Hello!」と「Hi there!」という無限の数字を出力します(また、に保存されていますdata.out)。echo最後は実行されません。

だから:

testPipe同様に関数の定義を変更します。たとえば、

function testPipe(){
        echo "va"
        cat
}

これは入力を消費し、それをパイプラインの次のステップに送るという効果があります。または、パイプラインの末尾にある場合は、標準出力がストリーム(文字列を含む行を含むva)の後にリダイレクトされる場所に送信します。 )。

おすすめ記事