하위 명령 내에서 명령이 실패하면 실패합니다.

하위 명령 내에서 명령이 실패하면 실패합니다.

디렉토리 목록에서 명령을 실행하고 싶습니다: gradle --build-cache. 또한 디렉터리는 "Project" 문자열로 시작해야 하며 "Test"로 끝나서는 안 됩니다. 다음 명령을 사용하여 이 작업을 성공적으로 수행했습니다.

find . -maxdepth 1 -type d \( ! -name . \) -name "Project*" ! -name "*Test*" -exec sh -c "cd '{}' && pwd && gradle --build-cache" \;

하지만 내 문제는 gradle 명령이 실패할 수 있다는 것입니다. 명령만 실행하면 "exit 1"이 반환되지만 디렉터리 명령 중 하나가 실패하면 실패를 반환하지 않고 스크립트가 계속됩니다. 마지막으로 루프는 성공을 반환합니다 exit 0...

gradle 명령이 실패할 때 루프 실행을 중지하고 일반 명령으로 돌아가는 방법은 무엇입니까 exit 1?

감사해요:)

답변1

비슷한 질문이에요https://apple.stackexchange.com/questions/49042/how-do-i-make-find-fail-if-exec-fails. 나는 귀하의 목표를 달성할 가능성이 가장 높은 두 가지 유용한 방법을 나열했습니다.

가장 간단한 방법은 을 사용하는 것이지만 xargs이는 명령이 찾을 수 있는 경로에 공백이 없는 경우에만 작동합니다 find.

find … -print0 | xargs -0 -n1 invalid_command

오래된 Bash(4.xx 미만)를 사용하고 있다면 재귀 와일드카드 찾기 및 사용을 제거하거나 재귀 검색을 직접 구현할 수도 있습니다(디렉토리 트리가 문제를 일으킬 만큼 충분히 깊은지는 의심스럽습니다).

shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done

또는 한 줄로 작성할 필요가 없다면 먼저 모든 디렉터리를 찾아 임시 파일( mktemp해당 파일용)에 저장한 다음 목록을 사용하여 필요한 모든 작업을 수행할 수 있습니다. 추가로 필터링하려면 해당 항목에 대해 명령을 실행하세요.

답변2

마지막 명령이 오류와 함께 종료되었는지 테스트한 다음 해당 줄에 exit추가하여 if [[ $? != 0 ]] ; then exit ; fi명령을 실행할 수 있습니다.

제공된 코드 조각이 더 큰 스크립트의 일부인 경우 스크립트가 완전히 종료됩니다. 이것을 사용할 수 있도록 foror 루프 로 다시 작성하는 것이 좋습니다 .whilebreak

답변3

재미삼아 여기에 find유일한 답변이 있습니다. POSIX 기능만으로는 이 작업을 수행할 수 없을 것 같지만 find이미 일부 GNUism을 사용하고 있으므로 기본 기능을 활용할 수 있습니다 -quit.

$ find -exec command {} \; -o -quit

이로 인해 실패 find시 즉시 종료됩니다 command(즉, 0이 아닌 종료 코드를 반환함). 이제 find0이 아닌 상태로 강제 종료하려면 에서 작업을 수행해야 합니다 -quit.

$ find -exec command {} \; -o -fprint /dev/full -quit

모든 쓰기가 /dev/full실패하기 때문입니다. 다음과 같은 오류 메시지를 받게 됩니다.

find: ‘/dev/full’: No space left on device

2>/dev/null필요한 경우 필터링할 수 있습니다.

당신이 사용하는 경우NetBSD 조회, 다음과 같이 할 수 있습니다.

$ find -exec command {} \; -o -exit 1

관련 정보