데모 출력을 함수로 파이프

데모 출력을 함수로 파이프

mosquitto_sub가 포함된 MQTT 메시지를 받았고 출력(두 문자열)을 함수로 리디렉션하고 싶습니다.

고객:

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) 다음에 리디렉션되는 곳으로 보냅니다. ).

관련 정보