문제

나는 소켓의 읽기 루프 안에 시그인트를 잡으려고 노력하지만,내가 요구하는 휴식 시간은 새로운 줄 후에 만 처리된다.그래서 실행중인 앱을 클릭 할 때 루프가 끊어 지거나 앱이 종료되기 전에 소켓에 새 줄이 도착할 때까지 기다려야합니다

이 최소 버전입니다 :

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3

어떻게 즉시 루프를 끊고 앱을 종료 할 수 있습니까?

도움이 되었습니까?

해결책

A break 당신이 원하는 곳에서 실행할 수있는 실제 명령이 아닙니까;그것은 단지 주변 루프를 떠날 지점을 표시하는 문법적 구조입니다.당신의 break 주변 루프가 없으므로 의미가 없습니다(그리고 오류입니다: bash: break: only meaningful in a `for', `while', or `until' loop).

당신은 죽일 필요 read 대신 명령:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid

물론 이것은 매우 조잡한 솔루션 일 뿐이며 종료 된 하위 쉘 등에서 발행 한 오류 메시지를 숨기지 않습니다.그러나 그것은 아이디어를 보여주고 당신이 질문 한 문제를 해결합니다.예상 오류 메시지 등을 숨기기 위해다른 질문을 할 수도 있습니다(또는 여기에서 이미 주어진 답변을 검색하십시오;-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top