#!/bin/bash
# tcpdump line buffered and piped to infinite loop
/usr/sbin/tcpdump -Avnni eth0 -l dst 192.168.0.51 and udp port 8076 | \
while true; do
# read output line by line
read result
# only act on non-blank output
if [ "$result" != "" ]; then
echo "Read a packet: $result"
# perform whatever action
send_ack &
fi
done
tcpdump로 나온 값을 파이프로 while에 넘긴거 맞음? 파이프 뒤에 \는 무슨 의미져??
저걸 for로 어떻게 짤까요? 그냥 저것처럼 while로 짜는게 더 자연스럽나여?
코드는
http://pastebin.com/67n6bF29
이걸로봐주새요 디시에선 문자 몇개가 지워지내요
3번 라인에서 파이프 뒤에 역슬래시는 무슨 의미져
역슬래시는 두 줄 이으라는 뜻이고 나머지는 주석 보면 됨 read가 뭔지를 알면 매우 간단한데 문서를 봐라
while 내부는 이해가 되는데 tcpdump와 while 구문이 서로 어떻게 상호작용하는지 아리송함
tcmpdump -l 옵션이 "표준 출력으로 나가는 데이터들을 line buffering한다." 라는 옵션이라고 하는데, 그럼 while에 한 라인씩 전달되서 한줄씩 read 하는것인가요
seq 1 10 | while read x; do echo $x; done이랑 for x in {1..10}; do echo $x; done이 같음
근데 for는 전부 다 읽지 않고서는 루프를 돌릴수조차 없는데 tcpdump는 그러면 안되니까 while을 쓴다
for로는 저런 프로그램을 짜는게 불가능한것인가요?
http://pastebin.com/EUbhitRW
이렇게 짜봤는데 실시간으로 터미널에 출력이 안되내요. for로 전달하는 값이 무한이라 전부 다 읽을 수 없어서 그런거군요
for와 while은 항상 서로 대체할 수 있는 구문이라고 생각했는데 배쉬 쉘에선 그렇지 않군요.. 배워갑니다