Bashパイプラインが動作を停止しました。

Bashパイプラインが動作を停止しました。

mosquitto_sub呼び出しの出力を処理するためのbashスクリプトを作成しています。

function testPipe(){
 read foo
 IFS=' ' read -ra ARRAY <<< "$foo"
 topic=${ARRAY[0]}
 cmd=${ARRAY[1]}
 echo "topic = $topic cmd = $cmd"
 cat
}

function pipeTee(){
 tee -a mqtt_broker.log
}

mosquitto_sub -h $HOST -p $PORT -t $TOPIC \
      -u $USER -P $PASS -v | pipeTee | testPipe

フォローしてみました。デモ出力を関数にパイプ。しかし、これが私が観察したものです。最初のメッセージがネットワーク経由で到着し、testPipe 関数が呼び出され、その行が解析されることがわかります。その後のすべてのメッセージは、元の形式でコンソールに印刷されます。つまり、ネットワークからのメッセージです。

私は何を間違えることができましたか? 「foo読み取り」はSTDINの入力を使用しませんか?

ベストアンサー1

ブローカーを起動したら、mosquitto次のようにmy/testトピックを購読します。

mosquitto_sub -t my/test -v

その後、簡単なメッセージを投稿して何を受け取るかを確認できます。例えば、

mosquitto_pub -t my/test -m inline

サブスクリプション出力に1行で表示されます。

my/test inline

すべてのメッセージがこのタイプの場合は、関数を呼び出すループを実行するだけです。

... | pipeTee | while testPipe; do : ; done

しかし、あなたの関数は使用できません。catそれ以外の場合は決して返されません。複数行のメッセージを送信するには、何らかの方法でcatメッセージの終わりを検出する別のwhileループを読み取ることに置き換える必要があります。たとえば、投稿する場合

echo -e 'my multi\nline test' | mosquitto_pub -t my/test -s

3行が表示されます。

my/test my multi
line test
<there is a blank line here>

空行は文字列にecho1つが追加されたためです。その後、次のものと交換する必要が\nあります。cat

while read data && [ "$data" != "" ]
do    echo "Got $data"
done

公開される内容を制御できるため、1行のデータを送信したり、簡単に見つけることができる特殊文字列でメッセージを終了したりすることをお勧めします===eof===

おすすめ記事