
몇 가지 숫자를 출력하는 서버가 있고 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가 더 이상 사용되지 않는 것 같습니다. -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
이것이 도움이 되기를 바랍니다.