Как бы один канал от socat к sed к bc к xargs?

844
user3397903

У меня есть сервер, выводящий некоторые числа, я читаю их с помощью 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 ничего не меняет.

0

1 ответ на вопрос

1
Alex Atkinson

Разбивая компоненты:

# 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

Надеюсь, это поможет.

В итоге: `xargs` ждет большего ввода. Я думаю, что `xargs -L 1`, вероятно, достаточно, чтобы избежать этого. Toby Speight 8 лет назад 0
Да, я вернулся, чтобы добавить опцию -n, но ваш комментарий может быть более действительным в зависимости от того, что пропущено и кто читает этот ответ. Благодарю. @TobySpeight Alex Atkinson 8 лет назад 0