명령이 실패하면 스크립트가 실패하지만 어떤 경우에도 모든 명령을 실행합니다.

명령이 실패하면 스크립트가 실패하지만 어떤 경우에도 모든 명령을 실행합니다.

소스 코드의 사용자 정의 린터인 스크립트에서 일부 명령을 실행해야 합니다. 각 실행은 보고서를 생성하고 규칙을 위반하면 종료 코드 1로 실패합니다. 보고서 생성에 실패하기 전에 모든 명령을 실행해야 하며, 0이 아닌 종료 코드로 명령이 실패하면 실패해야 합니다. 첫 번째 오류가 발생한 시점에 스크립트가 존재했기 때문에 스크립트가 작동하지 않습니다.

lint ./module1/src/main/java && lint ./module2/src/main/java && lint module3/src/main/java

지금은 다음 스크립트를 사용하고 있습니다.

lint ./module1/src/main/java
code1="$?"
lint ./module2/src/main/java
code2="$?"
lint ./module3/src/main/java
code3="$?"

if [[ "$code1" != "0" || "$code2" != "0" || "$code3" != "0" ]]; then
  exit 1
fi

하지만 지나치게 복잡하고 확장성이 없어 보입니다(추가 변수를 추가하고 다음 명령을 확인해야 함).

이 스크립트를 좀 더 우아하게 만들 수 있나요?

답변1

모든 테스트를 완료하고 최종 전체 상태 코드를 반환하려면 이 방식으로 코딩해야 합니다. 이것은 한 가지 방법입니다

#!/bin/bash
#
ss=0

lint ./module1/src/main/java || ((ss++))
lint ./module2/src/main/java || ((ss++))
lint ./module3/src/main/java || ((ss++))

exit $ss

작성된 대로 실패한 테스트 수에 해당하는 종료 코드로 실패합니다. 여전히 true/false(0/0이 아님)를 테스트할 수 있지만 1두 경우 모두 정확하게 종료하는 코드가 필요한 경우이상테스트가 실패하여 ((ss++))전체 로 변경되었습니다 ss=1.

답변2

약간의 해킹이지만 xargs이 목적으로 사용할 수 있습니다. 기본적으로 모든 명령을 실행하고 명령 중 하나라도 실패하면 상태 123으로 종료됩니다.

여기서는 세 가지 명령을 실행했는데 모두 실패했지만 실행되었습니다.

echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}

명령은 종료 상태 123(GNU xargs)으로 종료되지만 다음을 출력하여 세 가지 명령이 모두 실행되었음을 보여줍니다.

1
2
3

유사한 명령 세트는 모두 상태 0으로 성공적으로 종료됩니다.

echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}

예상한 대로 여기서 종료 상태는 0입니다.

관련 정보