Bash Loop-명령 내에서 Control-C를 누를 때 루프를 멈추는 방법은 무엇입니까?


35

몇 개의 디렉토리를 재 동기화하고 있습니다. bash 터미널이 열려 있고 다음과 같이 실행 중입니다.

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

그러나 모든 것을 멈추려면 Control-C를 누릅니다. 그러면 rsync가 중지되지만 다음 단계로 계속 진행됩니다. 이 경우, 나는 무슨 일이 있었는지 깨닫고 일이 다시 작동 할 때까지 미친 사람처럼 Control-C를 누르십시오.

이것을 '수정'할 방법이 있습니까? 그런 루프가 있고 Control-C를 누르면 내 bash 쉘로 돌아갑니다.


6
데니스의 대답은 옳은 것이지만, 그렇게하지 않았다면 '광인처럼 누르지 않아도됩니다', 그냥 잡고 키보드를 반복해서 처리하도록하세요.
Kyle Brandt

나는 항상 Cntl-C를 누르고 있으면 일반적으로 잘 작동합니다.
Scott Alan Miller

답변:


33
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

개별 rsync 실행이 어떤 이유로 실패하면 루프를 종료합니다.


4
추가 팁 : 중첩 루프에 있고 완전히 종료하려면을 사용하십시오 break 2(또는 "2"를 종료하려는 중첩 루프 수로 바꾸십시오).
Dolan Antenucci



6

괄호 안에 명령 문자열을 넣으면 문자열이 단일 프로세스로 작동하고 SIGINT를 수신하고 Ctrl- 를 누르면 종료됩니다 C.

(for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done)

그러나! rsync명령 의 경우 여러 소스를 허용하므로 작성한 코드는 다음과 같이 더 잘 작성됩니다.

rsync -a * example.com:somewhere/


0

루프에 쉽게 중단 될 수있는 다른 명령을 넣는 경향이 있습니다. 두 개의 Ctrl-C를 눌러야합니다.

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; sleep 1 ; done

이 rsync에 대한 훌륭한 솔루션은 아니지만 아마도 빠르게 실행하고 싶을 것입니다. 그러나 다음과 같은 다른 루프에서는 잘 작동합니다.

while true ; do ping -c 10 example.com ; sleep 1 ; done

이 루프는 루프를 통해 매번 example.com의 주소를 다시 검색하므로 DNS 변경을보고있는 경우 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.