나는 이와 같은 bash 스크립트를 가지고 있습니다
#!/bin/bash
do-this parm someotherparam
do-something-else $varz $(commands)
and-also-do-this -something
finally-do-something-different -yes
위의 모든 개별 명령이 0을 반환하는 경우 이 스크립트가 종료 상태 0을 반환하도록 하고 싶습니다. 단일 명령이 0이 아닌 값을 반환하면 0이 아닌 값을 반환하고 싶습니다. 0이 아닌 한 0이 아닌 값이 무엇인지 상관하지 않습니다.
분명히 각 줄 이후의 상태를 확인하면 장황하더라도 쉽게 목표를 달성할 수 있습니다. 나는 bash를 처음 접했기 때문에 이것을 작성하는 관용적인 방법이 있는지 궁금했습니다.
참고: 종료 상태에 관계없이 모든 명령이 실행되기를 원합니다. 그렇지 않으면 다음과 같습니다.이것작동합니다
답변1
#!/bin/bash
err=0
do-this parm someotherparam ; (( err |= $? ))
do-something-else $varz $(commands) ; (( err |= $? ))
and-also-do-this -something ; (( err |= $? ))
finally-do-something-different -yes ; (( err |= $? ))
이는 변수를 0으로 초기화한 다음 err
각 명령 후에 (비트별 OR) err
로 설정합니다. 0이 아닌 종료 상태로 명령이 종료되면 값은 0이 아닌 숫자로 설정되고 스크립트가 끝날 때까지 0이 아닌 상태로 유지됩니다.$err | $?
err
원하는 경우 exit "$err"
스크립트 끝에서 .
동일한 결과를 얻는 덜 수동적인 방법:
err=0
trap '(( err |= $? ))' ERR
# (rest of original script)
err
이는 명령이 0이 아닌 종료 상태로 종료될 때마다 위와 동일한 방식으로 오류 트랩을 설정합니다. 트랩은 스크립트를 종료하는 errexit
쉘 옵션( ) 과 set -e
동일한 조건에서 실행됩니다 . 작업을 단순하게 유지하기 위해 err=1
필요에 따라 트랩을 설정할 수 있습니다 .
코드 블록 이후 트랩을 취소하려면 다음을 사용하십시오.
trap - ERR