Language

[ shell script ] set -e, set -o, set -x

궁금한게 많은 개발자 2023. 2. 21. 12:47

set -e는 쉘스크립트에서 발생하는 오류나 에러가 발생하면 즉시 스크립트를 종료하는 옵션입니다. 이 옵션을 설정하면, 스크립트가 실행되는 도중에 어떤 명령어라도 실행이 실패하면 즉시 스크립트가 종료됩니다.

이 옵션을 사용하면, 에러 발생 시 그 에러를 잡고 처리하지 않아도 스크립트가 중단되므로, 스크립트 실행 중에 어떤 문제가 발생했는지 빠르게 파악할 수 있습니다. 이를 통해 디버깅을 용이하게 할 수 있습니다.

set -e를 사용하면, 스크립트에서 ||나 if문과 같은 복잡한 조건문을 사용하지 않아도 됩니다. 예를 들어, if문을 사용해 오류가 발생하면 종료하는 코드를 작성하면 아래와 같이 작성할 수 있습니다.

if ! command; then
  exit 1
fi

 

하지만, set -e를 사용하면 이 코드를 아래와 같이 간단하게 작성할 수 있습니다.

command

 

즉, set -e는 스크립트의 안정성과 디버깅을 쉽게 하기 위한 옵션입니다. 하지만, 모든 상황에서 이 옵션을 사용하는 것이 좋은 것은 아닙니다. 스크립트가 복잡하거나 특정 상황에서는 오류가 발생해도 스크립트를 계속 실행해야 하는 경우가 있을 수 있습니다. 이러한 경우에는 set -e를 사용하지 않아야 합니다.

 

 

 

set -x는 쉘 스크립트에서 디버깅을 위해 사용되는 옵션 중 하나입니다. 이 옵션을 사용하면 스크립트에서 실행되는 각각의 명령어가 실행되기 전에 그 명령어가 어떻게 해석되어 실행될 것인지를 출력합니다. 이렇게 하면 스크립트에서 문제가 발생했을 때, 그 문제를 빠르게 파악할 수 있습니다.​


set -x 옵션은 스크립트에서 디버깅을 수행할 때 매우 유용합니다. 그러나 스크립트에서 실행되는 모든 명령어가 출력되므로, 명령어가 많은 스크립트에서는 로그가 매우 많이 생성될 수 있습니다. 따라서, set -x를 사용할 때는 로그 파일을 잘 관리하고, 필요하지 않은 정보가 출력되지 않도록 주의해야 합니다.


 

 

set -o는 쉘 스크립트에서 쉘 옵션을 설정하거나 해제하기 위해 사용하는 명령어입니다. 이 명령어는 set과 동일한 역할을 하지만, 보다 직관적이고 편리한 방식으로 쉘 옵션을 설정할 수 있도록 도와줍니다.

set -o를 사용하면, 쉘에서 사용 가능한 모든 옵션을 확인할 수 있습니다. 예를 들어, 다음 명령어를 실행하면 쉘에서 사용 가능한 옵션 목록을 확인할 수 있습니다.

터미널에서 set -o 명령어를 실행하면, 현재 쉘에서 설정된 옵션 목록이 출력됩니다. 출력된 목록에서 각 옵션은 on 또는 off로 표시됩니다. on인 옵션은 설정된 상태이고, off인 옵션은 설정되지 않은 상태입니다.

set -o를 사용하여 쉘 옵션을 설정하거나 해제할 때는, 옵션 이름을 사용하여 설정하려는 옵션을 지정하고, on 또는 off를 사용하여 해당 옵션을 설정하거나 해제할 수 있습니다. 반대로, set +o를 사용하면 옵션을 해제할 수 있습니다.

 

예를 들어, set -o pipefail은 쉘 스크립트에서 파이프라인 명령어의 실행 결과를 체크할 수 있도록 도와주는 옵션입니다. 파이프라인 명령어는 두 개 이상의 명령어를 연결하여, 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 전달하는 방식으로 실행됩니다.

기본적으로 파이프라인 명령어는 실행된 명령어 중 가장 마지막에 실행된 명령어의 실행 결과를 반환합니다. 그러나 set -o pipefail 옵션을 사용하면, 파이프라인 명령어에서 실행된 모든 명령어의 실행 결과를 고려하여 파이프라인 명령어 전체의 실행 결과를 결정합니다.

예를 들어, 다음과 같은 파이프라인 명령어를 실행한다고 가정해보겠습니다.

command1 | command2

 

위 명령어에서 command1과 command2는 각각 명령어를 실행하는 프로그램입니다. 이 명령어를 실행하면, command1에서 출력된 결과가 command2의 입력으로 전달됩니다. 만약 command1이 에러를 발생시키면, command2는 더 이상 실행되지 않을 수 있습니다. 그러나 기본적으로는 command2의 실행 결과만을 고려하여 전체 명령어의 실행 결과를 결정합니다.

하지만 set -o pipefail 옵션을 사용하면, command1과 command2의 실행 결과를 모두 고려하여 전체 명령어의 실행 결과를 결정합니다. 즉, command1이 에러를 발생시키면 전체 명령어가 에러로 처리됩니다.

예를 들어, 다음과 같은 명령어를 실행한다고 가정해보겠습니다.

set -o pipefail
false | true
echo $?

 

위 명령어는 set -o pipefail 옵션을 사용하여 파이프라인 명령어의 실행 결과를 체크합니다. 첫 번째 명령어인 false는 항상 실패하므로, 파이프라인 명령어 전체는 실패합니다. 그래서 echo $? 명령어를 사용하여 전체 명령어의 실행 결과를 확인하면 1이 출력됩니다.

따라서, set -o pipefail 옵션은 파이프라인 명령어에서 에러가 발생하면 해당 명령어의 실행 결과를 바로 확인할 수 있게 해주어, 쉘 스크립트에서 오류 처리를 보다 효과적으로 할 수 있습니다.