다음과 같은 스크립트가 있다고 가정해 보겠습니다.
command1 params
command2 params
command3 params
이제 내가 이해하는 바에 따르면 각 명령은 이전 명령의 반환 상태와 독립적으로 실행됩니다. 그러나 나는 그것들이 모두 단일 트랜잭션으로 실행되기를 원합니다. 즉, 이전 명령이 실패하면 스크립트는 다음과 같습니다.
- 계속해서는 안 된다
- 이상적으로는 이전 명령으로 수행된 복원 작업
첫 번째 질문의 경우 &&
연산자를 사용하여 모든 명령을 연결할 수 있거나 각 명령 뒤에 if 검사를 수행할 수 있지만 $?
이러한 방법이 유일한 옵션입니까?
두 번째 질문에 대한 표준 접근 방식은 무엇입니까?
답변1
명령을 함께 연결하는 또 다른 방법은 옵션 세트(옵션이라고도 함)를 사용하여 &&
스크립트, 스크립트의 일부 또는 하위 쉘을 실행하는 것입니다. 이로 인해 스크립트나 서브셸이 오류와 함께 종료됩니다.-e
set -e
errexit
( set -e
command1
command2
command3 )
이미 수행된 단계를 롤백하는 경우 쉘 스크립트에서는 이것이 불가능할 수 있습니다.
exit
시스템 재부팅을 수행하거나 심지어 디스크의 데이터를 조작하는 스크립트를 예로 들어 보겠습니다.
( set -e
if (( $# == 0 )); then
echo "No command line arguments!" >&2
exit
fi
echo "We're cool"
false )
( set -e
case "$cmd" in
restart) sudo reboot ;;
greet) echo "Hi there" ;;
*) echo "Huh?" ;;
esac
false )
( set -e
rm -f /tmp/important_tmp_file
echo "oh oh"
false )
exit
수행된 작업을 롤백하거나 수행된 작업을 다시 시작하거나 파일 삭제를 자동으로 취소할 수 있는 방법은 없습니다 . 또한 터미널의 출력도 셸에 의해 제어되지 않으며 다시 호출할 수 없습니다.