Как бы одна труба от socat к sed к bc к xargs?
У меня есть сервер, выводящий некоторые числа, я читаю их с помощью socat, затем использую sed, я превращаю эти числа в некоторые математические уравнения, запускаю их с помощью bc, а затем мне нужно передать их в xargs.
socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo
Труба выше не производит никакого выхода. Моя труба точно такая же, за исключением оператора sed, и она также не выдает никаких результатов.
yes | gsed -u s/.*/1+1/ | bc | xargs echo
Тем не менее, труба, подобная вышеприведенной, печатает на консоли связку 2 с, как и ожидалось. Обе трубы должны быть одинаковыми, потому что строка sed изменяет все в одну фразу, несмотря ни на что. Почему труба с socat не дает выхода? Мое единственное предположение, что сервер отправляет числа только раз в секунду, и есть какая-то проблема с буфером, но использование stdbuf -o0 ничего не меняет.
1 ответ
Разбивая компоненты:
# From host1 - Start with 'socat'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl -
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
foo
# From host1 - Add 'sed'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
1+1
# From host1 - add 'bc'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2
# From host1 - add 'xargs echo'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
[ nothing ]
Чего не хватает? Заполнитель. Примечание: "-i" включает замещающие строки, а "{}" - это заполнитель.
# From host1 - setup xargs with -i
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -i{} echo {}
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2
Хм. Кажется, я депортирован. Используйте -I.
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -I{} echo {}
ИЛИ используйте '-n1', чтобы установить max-args равным 1.
socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -n1
ИЛИ используйте '-L1', чтобы установить max-lines равными 1. Как упоминалось в комментариях.
socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -L1
Подробнее о сложных командах:
http://www.tldp.org/LDP/abs/html/moreadv.html
Надеюсь, это поможет.