나중에 종료 코드 저장


15

그래서 몇 가지 테스트를 실행하는 작은 스크립트가 있습니다.

javac *.java && java -ea Test
rm -f *.class

이제 이것의 문제는 스크립트를 실행할 때 ./test테스트가 rm -f *.class성공 하여 테스트가 실패하더라도 성공 종료 코드를 반환한다는 것 입니다.

내가 원하는 것을 할 수있는 유일한 방법은 나에게 추악한 느낌입니다.

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi

그러나 이것은 일반적인 문제 인 것처럼 보입니다. 작업을 수행하고 정리 한 다음 원래 작업의 종료 코드를 반환하십시오.

이것을하는 가장 관용적 인 방법은 무엇입니까 (일반적으로 bash 또는 쉘)?

답변:


5

다음 exit과 같이 와 rm명령을 하나의 간단한 명령으로 eval묶을 수 있습니다.

java ... && java ...
eval "rm -f *.class; exit $?"

$?전달 될 때의 방식 exiteval실행 직전에 할당 되는 값입니다.


eval항상 팬이 선호합니다.
mikeserv

23

나는 함께 갈 것이다 :

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
exit "$test_exit_code"

exit이용 가능할 때 왜 뛰어 다니 나요?


당신은 사용할 수 있습니다 trap:

trap 'last_error_code=$?' ERR

예를 들면 다음과 같습니다.

$ trap 'last_error_code=$?' ERR
$ false
$ echo $?
1
$ echo $last_error_code $?
1 0

아 내 원본보다 낫다는 데 동의합니다. 그러나 종료 코드를 변수에 명시 적으로 저장해야한다는 것은 여전히 ​​불만족 스럽습니다. 종료 코드를 '푸시'하고 나중에 다시 '팝'할 수있는 방법이 없습니까?
math4tots

@ math4tots 업데이트를 시도하십시오.
muru

따라서 업데이트를 사용하면 last_error_code를 0으로 초기화 한 다음 끝 부분으로 돌아가서 어떤 명령으로 오류가 발생하면 0이 아닌 종료 코드가 있어야합니까? 멋진 트릭이지만 두 줄 핵 스크립트의 경우 @mikeserv의 대답을 선호한다고 생각합니다.
math4tots

@ math4tots 항상 할 수 있습니다 exit ${last_error_code:=0}.
muru

@avip 무엇을 위해? 이미 작은 따옴표로 묶여 있으므로 트랩이 호출 될 때만 변수가 평가됩니다.
muru

9

내가 아는 한 bash가 try...finally더 C와 같은 프로그래밍 언어 (사용 가능한 경우 아마도 원할 것임) 의 블록에서 블록에 가장 가까운 것은 trap건설입니다. 이것은 다음과 같이 작동합니다 :

trap "rm -f *.class" EXIT
javac *.java && java -ea Test

스크립트가 종료되면 "rm -f * .class"가 실행됩니다. 더 복잡한 일이 있으면 기능에 넣을 수 있습니다.

cleanup() {
    ...
}
trap cleanup EXIT
javac *.java && java -ea Test

당신이 너무 기울어지면 이것을 try...catch...finallyC 의 블록 처럼 작동하는 상당히 일반적인 관용구로 바꿀 수 있습니다 .

(
  trap "catch_block; exit" ERR
  trap finally_block EXIT
  # contents of try goes here
)

괄호는 서브 쉘을 구분합니다. 이 구성을 사용하면 명령이 실패하면 전체 스크립트가 아닌 서브 쉘 만 종료됩니다. 서브 쉘은 다소 계산 비용이 많이 들기 때문에 너무 많은 수백 개를 사용하지 마십시오. 스크립트에 따라 쉘 함수 및를 사용하면 동일한 효과를보다 효율적으로 얻을 수 trap ... RETURN있지만, 조사하는 것은 사용자의 몫입니다.

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