소스 코드의 사용자 정의 린터인 스크립트에서 일부 명령을 실행해야 합니다. 각 실행은 보고서를 생성하고 규칙을 위반하면 종료 코드 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입니다.