시긴트에서 배쉬 브레이크 리드 라인
문제
나는 소켓의 읽기 루프 안에 시그인트를 잡으려고 노력하지만,내가 요구하는 휴식 시간은 새로운 줄 후에 만 처리된다.그래서 실행중인 앱을 클릭 할 때 루프가 끊어 지거나 앱이 종료되기 전에 소켓에 새 줄이 도착할 때까지 기다려야합니다
이 최소 버전입니다 :
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
물론 이것은 매우 조잡한 솔루션 일 뿐이며 종료 된 하위 쉘 등에서 발행 한 오류 메시지를 숨기지 않습니다.그러나 그것은 아이디어를 보여주고 당신이 질문 한 문제를 해결합니다.예상 오류 메시지 등을 숨기기 위해다른 질문을 할 수도 있습니다(또는 여기에서 이미 주어진 답변을 검색하십시오;-)
제휴하지 않습니다 StackOverflow