
いくつかの数値を出力するサーバーがあり、それらを 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 のパイプはなぜ出力を生成しないのでしょうか。私の推測では、サーバーは 1 秒に 1 回だけ数値を送信し、何らかのバッファの問題があると思われますが、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 は非推奨のようです。-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」を使用して最大行数を 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
これが役に立つことを願っています。