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

구독 출력에 한 줄로 표시됩니다.

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>

빈 줄은 string 에 echo하나가 추가되었기 때문입니다. 그런 다음 다음과 같은 것으로 교체 \n해야합니다 .cat

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

게시되는 내용을 제어할 수 있으므로 한 줄의 데이터를 보내거나 쉽게 찾을 수 있는 특수 문자열로 메시지를 끝내는 것을 선호할 수 있습니다 ===eof===.

관련 정보