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

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

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

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

그러나 모든 것을 중지하려면 Control-C를 누릅니다. 그러면 rsync가 중지되지만 다음 단계로 계속 진행됩니다. 이 경우 무슨 일이 일어났는지 깨닫고 다시 작동할 때까지 미치광이처럼 Ctrl-C를 누르십시오.

이 문제를 '수정'할 수 있는 방법이 있나요? 그런 루프가 있고 Ctrl-C를 누르면 bash 쉘로 돌아가게 되기를 원합니다.

답변1

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

어떤 이유로 개별 rsync 실행이 실패하는 경우에도 루프가 종료됩니다.

답변2

Dennis의 답변을 확장하려면 코드는 다음과 같습니다.

trap "echo Exited!; exit;" SIGINT SIGTERM

rsync와 관련된 실제 예제를 보려면 다음을 확인하세요.http://gist.github.com/279849.

답변3

Control-C에 대한 트랩을 설정할 수 있습니다.

trap <command> SIGINT

commandControl-C를 누르면 실행됩니다 . trap스크립트의 효과를 원하는 지점에 해당 명령문을 넣으면 됩니다 .

답변4

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

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

하지만! 명령 의 경우 rsync여러 소스를 허용하므로 작성한 코드는 다음과 같이 작성하는 것이 더 좋습니다.

rsync -a * example.com:somewhere/

관련 정보