스크립트가 트랜잭션으로 성공적으로 실행되는지 확인하는 방법

스크립트가 트랜잭션으로 성공적으로 실행되는지 확인하는 방법

다음과 같은 스크립트가 있다고 가정해 보겠습니다.

command1 params
command2 params
command3 params

이제 내가 이해하는 바에 따르면 각 명령은 이전 명령의 반환 상태와 독립적으로 실행됩니다. 그러나 나는 그것들이 모두 단일 트랜잭션으로 실행되기를 원합니다. 즉, 이전 명령이 실패하면 스크립트는 다음과 같습니다.

  1. 계속해서는 안 된다
  2. 이상적으로는 이전 명령으로 수행된 복원 작업

첫 번째 질문의 경우 &&연산자를 사용하여 모든 명령을 연결할 수 있거나 각 명령 뒤에 if 검사를 수행할 수 있지만 $?이러한 방법이 유일한 옵션입니까?

두 번째 질문에 대한 표준 접근 방식은 무엇입니까?

답변1

명령을 함께 연결하는 또 다른 방법은 옵션 세트(옵션이라고도 함)를 사용하여 &&스크립트, 스크립트의 일부 또는 하위 쉘을 실행하는 것입니다. 이로 인해 스크립트나 서브셸이 오류와 함께 종료됩니다.-eset -eerrexit

( 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수행된 작업을 롤백하거나 수행된 작업을 다시 시작하거나 파일 삭제를 자동으로 취소할 수 있는 방법은 없습니다 . 또한 터미널의 출력도 셸에 의해 제어되지 않으며 다시 호출할 수 없습니다.

관련 정보