일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- terraform
- 자바스크립트
- asgi
- docker
- Python
- dockerfile
- elasticsearch
- FastAPI
- kernel
- Deployment
- YAML
- Kubernetes
- ansible
- WSGI
- EKS
- 쿠버네티스
- github
- EC2
- K8S
- intervals
- asyncio
- Django
- leetcode
- event loop
- Service
- ebs
- POD
- AWS
- IAC
- IAM
- Today
- Total
궁금한게 많은 개발자 노트
[ shell script ] set -e, set -o, set -x 본문
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 옵션은 파이프라인 명령어에서 에러가 발생하면 해당 명령어의 실행 결과를 바로 확인할 수 있게 해주어, 쉘 스크립트에서 오류 처리를 보다 효과적으로 할 수 있습니다.
'Language' 카테고리의 다른 글
[ python ] future / task object (0) | 2023.04.16 |
---|---|
[ python ] asyncio/coroutine/eventloop (0) | 2023.04.16 |
[ python ] python답게 코딩하기 (0) | 2023.01.23 |
[ python ] event loop (2) (0) | 2022.05.24 |
[ python ] event loop (1) (0) | 2022.05.24 |