Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

linux shell script stops after first line

I try to execute etherwake based on a MQTT topic. The output of mosquitto_sub stops if I pipe it in a while statement.

works:

# mosquitto_sub -L mqtt://... | grep -o -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}'
00:00:00:00:de:ad
00:00:00:00:be:ef
00:00:00:00:ca:fe
(goes on and on)

does not work:

mosquitto_sub -L mqtt://... \
  | grep -o -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}' \
  | hexdump

Output stops after a single line:

0000000 1234 5678 9abc def0 abcd cafe 3762 3a65

The big picture is this one:

mosquitto_sub -L mqtt://... \
  | grep -o -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}' \
  | while read macaddr; do
      echo "send WOL to " $macaddr;
      /usr/bin/etherwake -D -b "$macaddr" 2>&1;
    done

Usually I am fine with the Linux shell but this time it simply gets stuck after the first line.

My guess is there is some problem with stdin or stdout (is not read or full etc.) in some kind. But I am out ideas.

By the way its an OpenWRT shell so an ash and no bash.

like image 512
muebau Avatar asked May 21 '26 01:05

muebau


1 Answers

The problem is indeed the "buffering" of grep when used with pipes.

Usually the '--line-buffered' switch should be used to force grep to process the data line by line instead of buffer the data.

Because grep on OpenWRT (busybox) does not have this switch 'awk' is used:

mosquitto_sub -L mqtt://... \
  | awk '/([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}/{ print $0 }' \
  | hexdump

If there is no busybox version of grep used the solution would be like:

mosquitto_sub -L mqtt://... \
  | grep -o --line-buffered -E '([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}' \
  | hexdump

Thank you all a lot for your help.

like image 181
muebau Avatar answered May 22 '26 14:05

muebau



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!