리눅스에서 셸 스크립트를 작성할 때 기억해두면 큰 도움이 되는 실용적인 팁들을 소개합니다.
셸 스크립트는 리눅스는 물론 macOS, 그리고 WSL(Windows Subsystem for Linux)을 통해 윈도우에서까지 작업 흐름을 자동화할 수 있는 매우 유연한 도구입니다. 다만 셸 스크립팅은 문법과 동작 방식에 특유의 특성이 있어서, 이를 제대로 이해하고 활용하면 스크립트를 훨씬 간결하고 안전하게 만들 수 있습니다.
Bash 스크립팅 핵심 팁
아래 팁들은 인터넷 곳곳에서 수집한 내용에 직접 경험을 바탕으로 한 몇 가지를 더한 것입니다.
1. 오류가 발생해도 Bash 스크립트는 계속 실행됩니다!
Bash는 기본적으로 오류가 발생해도 스크립트 실행을 멈추지 않습니다. 이는 특히 사용자 입력을 받거나 파일을 다룰 때 심각한 문제를 일으킬 수 있습니다. 이러한 동작을 방지하려면 스크립트 시작 부분에 set 명령어를 추가하세요.
set -eu
-e 옵션은 오류 발생 시 즉시 종료하도록 하고, -u 옵션은 값이 설정되지 않은 변수를 사용하려 할 때 종료하도록 합니다.
2. 반드시 shebang(셔뱅)을 포함하세요
스크립트의 첫 번째 줄에는 항상 shebang을 포함해야 합니다:
#!/bin/sh
shebang은 시스템에게 어떤 셸로 스크립트를 해석해야 하는지 알려주는 역할을 하며, 호환성 측면에서 매우 중요합니다. Bash용으로 작성된 스크립트는 Zsh에서 실행하면 다르게 동작할 수 있지만, shebang을 포함하면 올바른 셸로 해석되도록 보장할 수 있습니다.
3. 스크립트 내부에서 sudo를 사용하지 마세요
스크립트 내부에서 sudo를 사용하면 실행 시 모호함이 생기고, 파이프나 리디렉션을 사용할 때 문제가 발생할 수 있습니다. 보안상으로도 바람직하지 않습니다. 스크립트에 root 권한이 필요하다면 스크립트 전체를 root로 실행하거나 sudo와 함께 실행하는 것이 올바른 방법입니다.
4. 스크립트가 root/sudo 권한으로 실행 중인지 확인하기
아래 명령어를 스크립트 시작 부분에 추가하면 root/sudo 권한으로 실행되고 있는지 확인할 수 있습니다. 이렇게 하면 root 권한이 필요한 명령어를 실행하다가 실패하는 것이 아니라, 스크립트가 어떤 작업도 수행하기 전에 미리 중단되도록 만들 수 있습니다.
# Check if running as root
if ((EUID!=0 )); then
printf "Please run as root"
exit 1
fi
5. -y 옵션으로 apt 확인 프롬프트 건너뛰기
apt 명령어 끝에 -y 옵션을 추가하면 설치 확인 프롬프트를 건너뛰어 사용자 입력 없이 스크립트가 자동으로 진행될 수 있습니다:
sudo apt install nano -y
또는
sudo apt upgrade -y
6. 경로에는 반드시 따옴표를 사용하세요!!!
Bash 스크립트를 작성할 때는 경로에 항상 따옴표를 붙여야 합니다. 그만큼 중요한 부분이라 별도의 글로 자세히 설명할 필요가 있을 정도입니다. 공백이나 특수문자가 포함된 경로에서 발생할 수 있는 예기치 않은 오류를 예방할 수 있습니다.
7. 현재 작업 디렉터리 기준으로 경로 처리하기
CURR_DIR="$(dirname $0);"
printf -- 'moving application to /opt/app.jar';
mv "${CURR_DIR}/application.jar" /opt/app.jar;
8. 사용자 입력 변수에 기본값 설정하기
사용자에게 입력을 요청할 때는 아래와 같은 방법으로 기본값을 설정할 수 있습니다:
echo "Enter a value"
read val
val=${val:-"Default Value"}
변수 val을 읽은 후 값이 비어 있다면 기본값이 대신 설정됩니다.
9. 충분한 주석 남기기
주석은 결국 미래의 자신을 위한 것입니다. 무엇을 하는지, 왜 하는지 설명해두세요. 코드의 의도를 명확히 하는 것은 좋은 점검 도구이자 디버깅에도 도움이 되며, 충분한 주석 덕분에 나중에 코드로 돌아왔을 때 쉽게 이해할 수 있습니다.
10. 출력, 출력, 또 출력
콘솔에 최대한 많은 정보를 출력하세요. 그래야 스크립트가 비정상 종료되었을 때 어디서 문제가 발생했는지 파악할 수 있습니다. Bash 스크립트는 기본적으로 상세한 출력을 하지 않으므로 의도적으로 로그를 남기는 습관이 중요합니다.
11. 종료 상태 코드 반환하기
스크립트에서 오류가 발생했다면 적절한 종료 코드와 함께 종료되도록 하세요. 그래야 해당 스크립트를 호출하는 다른 스크립트들이 상황에 맞게 적절히 대응할 수 있습니다.