이미지 로딩 중...

첫 번째 Bash 스크립트 작성 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 11. 17. · 3 Views

첫 번째 Bash 스크립트 작성 완벽 가이드

Linux/Unix 환경에서 자동화의 시작점인 Bash 스크립트 작성법을 처음부터 끝까지 배워봅니다. Hello World부터 실행 권한 설정까지, 여러분의 첫 스크립트를 만들어보세요.


목차

  1. Hello World 스크립트 작성
  2. Shebang(#!) 라인의 의미
  3. 스크립트 파일 생성 및 저장
  4. chmod로 실행 권한 부여
  5. 스크립트 실행 방법 (./script.sh)
  6. 주석 작성 규칙

1. Hello World 스크립트 작성

시작하며

여러분이 매일 반복적으로 해야 하는 작업이 있나요? 예를 들어, 매번 서버에 접속해서 로그 파일을 확인하고, 특정 데이터를 찾아서 복사하고, 보고서를 만드는 작업 같은 것 말이죠.

이런 작업을 손으로 하나하나 하다 보면 시간도 오래 걸리고 실수도 생기기 쉽습니다. 개발자들은 이런 반복 작업을 자동화하기 위해 스크립트를 작성합니다.

스크립트는 마치 요리 레시피처럼, 컴퓨터에게 "이것 하고, 저것 하고, 그 다음 이것 해!"라고 순서대로 명령을 내리는 파일입니다. 그중에서도 Bash 스크립트는 Linux와 Mac에서 가장 많이 사용되는 자동화 도구입니다.

복잡한 프로그래밍 언어를 배우지 않아도, 여러분이 터미널에서 치던 명령어들을 파일에 저장해두기만 하면 됩니다. 지금부터 프로그래밍의 전통적인 첫 걸음인 "Hello World"를 출력하는 스크립트를 만들어보겠습니다.

이 간단한 예제가 여러분의 자동화 여정의 시작점이 될 것입니다.

개요

간단히 말해서, Hello World 스크립트는 화면에 "Hello World"라는 메시지를 출력하는 가장 기본적인 프로그램입니다. 왜 이렇게 간단한 것부터 시작할까요?

Hello World는 여러분의 개발 환경이 제대로 작동하는지 확인하는 테스트이자, 스크립트의 기본 구조를 이해하는 첫 단계입니다. 실무에서도 새로운 언어나 도구를 배울 때 항상 Hello World부터 시작합니다.

기존에는 터미널에서 echo "Hello World"를 직접 입력해야 했다면, 이제는 이 명령을 파일에 저장해두고 언제든지 실행할 수 있습니다. 더 나아가, 이 파일에 수십 개, 수백 개의 명령을 추가할 수 있습니다.

Bash 스크립트의 핵심 특징은 세 가지입니다: 첫째, 텍스트 파일이므로 메모장으로도 작성 가능합니다. 둘째, 실행 권한만 주면 프로그램처럼 동작합니다.

셋째, Linux 시스템의 모든 명령어를 사용할 수 있습니다. 이러한 특징들 덕분에 시스템 관리자와 개발자들이 매일 사용하는 필수 도구가 되었습니다.

코드 예제

#!/bin/bash
# 이것은 나의 첫 번째 Bash 스크립트입니다
# 화면에 Hello World 메시지를 출력합니다

echo "Hello World"
echo "나의 첫 스크립트가 실행되었습니다!"

# 현재 날짜와 시간도 함께 출력해봅시다
echo "실행 시간: $(date)"

설명

이것이 하는 일: 이 스크립트는 터미널 화면에 세 가지 메시지를 순서대로 출력합니다. 마치 여러분이 직접 명령어를 세 번 입력한 것과 같은 효과를 냅니다.

첫 번째로, echo "Hello World" 명령이 실행됩니다. echo는 "메아리"라는 뜻인데, 뒤에 나오는 내용을 그대로 화면에 보여주는 명령어입니다.

따옴표 안의 내용이 정확히 그대로 출력됩니다. 이것은 사용자에게 메시지를 보여주거나, 스크립트가 어느 단계를 실행 중인지 알려줄 때 사용합니다.

그 다음으로, 두 번째 echo가 실행되면서 "나의 첫 스크립트가 실행되었습니다!"라는 확인 메시지를 보여줍니다. 실무에서는 이런 식으로 스크립트의 각 단계마다 진행 상황을 출력하여 디버깅과 모니터링을 쉽게 만듭니다.

세 번째로, echo "실행 시간: $(date)" 부분이 실행됩니다. 여기서 $(date)는 명령어 치환(command substitution)이라는 기법입니다.

$( ) 안의 명령어가 먼저 실행되고, 그 결과가 문자열에 삽입됩니다. date 명령어는 현재 날짜와 시간을 반환하므로, 최종적으로 "실행 시간: 2025년 11월 17일 월요일 ..."과 같은 형태로 출력됩니다.

여러분이 이 스크립트를 사용하면 화면에 메시지를 출력하는 방법, 여러 명령을 순서대로 실행하는 방법, 그리고 다른 명령의 결과를 활용하는 방법을 배울 수 있습니다. 실무에서는 이 기본기를 활용해서 배포 스크립트, 백업 스크립트, 모니터링 스크립트 등을 작성합니다.

실전 팁

💡 echo 명령어 뒤에 -e 옵션을 사용하면 \n(줄바꿈), \t(탭) 같은 특수 문자를 사용할 수 있습니다. 예: echo -e "첫 줄\n두 번째 줄"

💡 큰따옴표(" ")와 작은따옴표(' ')는 다릅니다. 큰따옴표 안에서는 $변수가 치환되지만, 작은따옴표 안에서는 그대로 출력됩니다.

💡 스크립트 실행 후 echo $?를 입력하면 마지막 명령의 성공 여부를 확인할 수 있습니다(0이면 성공, 그 외는 에러).

💡 긴 메시지를 여러 줄로 나눠 쓰고 싶다면 백슬래시()를 줄 끝에 붙이면 됩니다: echo "이것은 아주 \긴 메시지입니다"

💡 출력 결과를 파일로 저장하려면 > 기호를 사용하세요: ./hello.sh > output.txt


2. Shebang(#!) 라인의 의미

시작하며

여러분이 스크립트 파일을 더블클릭하거나 ./myscript.sh로 실행했을 때, 컴퓨터는 어떻게 이 파일을 해석해야 할지 알까요? 텍스트 파일을 열어야 할까요, 프로그램으로 실행해야 할까요?

Python으로 실행해야 할까요, Bash로 실행해야 할까요? 이런 혼란을 방지하기 위해 Unix 시스템은 특별한 규칙을 만들었습니다.

바로 파일의 첫 줄에 "이 파일은 이 프로그램으로 실행해주세요!"라고 명시하는 것입니다. 그것이 바로 Shebang(셔뱅) 라인입니다.

#!로 시작하는 이 신비로운 첫 줄은, 운영체제에게 "이 스크립트를 어떤 인터프리터로 실행할지" 알려주는 표지판 역할을 합니다. 많은 초보자들이 이 줄을 그냥 복사-붙여넣기만 하고 넘어갑니다.

하지만 Shebang의 원리를 이해하면, 여러분은 Bash뿐만 아니라 Python, Ruby, Perl 등 어떤 언어로든 실행 가능한 스크립트를 만들 수 있습니다.

개요

간단히 말해서, Shebang은 스크립트 파일의 첫 줄에 #!/bin/bash처럼 작성하여, 운영체제에게 이 파일을 실행할 인터프리터의 경로를 알려주는 지시문입니다. 왜 이것이 필요할까요?

스크립트 파일은 그 자체로는 실행할 수 없는 텍스트 파일입니다. 실제로 실행하려면 bash, python, ruby 같은 인터프리터 프로그램이 필요합니다.

Shebang이 없으면 bash myscript.sh처럼 매번 인터프리터를 명시해야 하지만, Shebang이 있으면 ./myscript.sh만으로 실행 가능합니다. 실무에서는 크론잡이나 자동화 도구에서 스크립트를 실행할 때 매우 중요합니다.

기존에는 스크립트마다 어떤 인터프리터를 사용해야 할지 별도로 기억해야 했다면, 이제는 파일 자체가 그 정보를 담고 있습니다. Shebang의 핵심 특징: 첫째, 반드시 파일의 정확히 첫 번째 줄이어야 합니다(빈 줄도 안 됨).

둘째, #!로 시작하며 공백 없이 붙여 써야 합니다. 셋째, 뒤에는 인터프리터의 절대 경로가 옵니다.

이 규칙들을 지키지 않으면 운영체제가 인식하지 못합니다.

코드 예제

#!/bin/bash
# Shebang 라인의 다양한 형태를 보여주는 예제

# 방법 1: 직접 경로 지정 (가장 빠름)
#!/bin/bash

# 방법 2: env 사용 (이식성 좋음, 추천)
#!/usr/bin/env bash

# Python 스크립트라면
#!/usr/bin/env python3

# 실제 스크립트 내용
echo "Shebang이 정확히 작동하고 있습니다!"

설명

이것이 하는 일: Shebang 라인은 스크립트가 실행될 때 운영체제의 커널이 가장 먼저 읽는 부분입니다. 커널은 이 줄을 보고 "아, 이 파일은 /bin/bash 프로그램으로 실행해야 하는구나"라고 판단합니다.

첫 번째로, #!/bin/bash는 bash 인터프리터의 절대 경로를 직접 지정하는 방식입니다. /bin/bash는 대부분의 Linux 시스템에서 bash가 설치된 위치입니다.

이 방법은 빠르고 명확하지만, 시스템마다 bash 위치가 다를 수 있다는 단점이 있습니다. 예를 들어 어떤 시스템은 /usr/local/bin/bash에 bash가 있을 수 있습니다.

그 다음으로, #!/usr/bin/env bash는 env 명령어를 활용한 방식입니다. env는 환경 변수 PATH에서 bash를 찾아서 실행합니다.

이것은 마치 "bash가 어디 있든 찾아서 실행해!"라고 말하는 것과 같습니다. 이 방법은 이식성이 뛰어나서 다양한 시스템에서 동작하므로, 현대적인 스크립트에서 권장되는 방식입니다.

세 번째 예시인 #!/usr/bin/env python3는 Python 스크립트에서 사용하는 Shebang입니다. 같은 원리로, 파일 확장자가 .py든 .sh든 상관없이 이 줄만 있으면 Python 인터프리터로 실행됩니다.

이것이 Shebang의 강력한 점입니다. 파일 확장자가 아니라 Shebang이 실행 방식을 결정합니다.

여러분이 Shebang을 올바르게 사용하면 크로스 플랫폼 호환성이 높은 스크립트를 작성할 수 있고, 다른 개발자들이 여러분의 스크립트를 실행할 때 혼란을 겪지 않게 됩니다. 실무에서는 CI/CD 파이프라인, 도커 컨테이너, 다양한 서버 환경에서 같은 스크립트를 실행해야 하므로 올바른 Shebang 사용이 매우 중요합니다.

실전 팁

💡 항상 #!/usr/bin/env bash를 사용하세요. 직접 경로보다 이식성이 훨씬 좋습니다.

💡 Shebang 앞에 빈 줄이나 공백이 있으면 작동하지 않습니다. 반드시 파일의 정확히 첫 번째 줄이어야 합니다.

💡 bash의 버전을 명시하고 싶다면 which bash로 경로를 확인한 후 직접 지정하거나, 스크립트 내에서 버전을 체크하세요.

💡 Windows의 Git Bash나 WSL에서도 Shebang이 작동하므로, 크로스 플랫폼 스크립트 작성에 유용합니다.

💡 옵션을 Shebang에 포함할 수 있습니다: #!/bin/bash -x는 디버그 모드로 실행합니다.


3. 스크립트 파일 생성 및 저장

시작하며

여러분이 아무리 훌륭한 코드를 작성해도, 그것을 파일로 저장하지 않으면 한 번 쓰고 사라집니다. 스크립트를 파일로 저장한다는 것은 여러분의 자동화 로직을 영구적으로 보존하고, 언제든 재사용할 수 있게 만드는 것입니다.

많은 초보자들이 "파일을 어디에 저장해야 하나?", "확장자는 뭘로 해야 하나?", "어떤 에디터를 써야 하나?" 같은 질문을 합니다. 이런 작은 결정들이 나중에 큰 차이를 만듭니다.

스크립트 파일 생성은 단순히 텍스트를 파일에 쓰는 것 이상입니다. 올바른 위치, 올바른 이름, 올바른 형식으로 저장해야 나중에 관리하기 쉽고, 다른 사람들과 협업할 때도 문제가 없습니다.

지금부터 실무에서 사용하는 모범 사례를 따라 스크립트 파일을 생성하고 저장하는 방법을 배워보겠습니다.

개요

간단히 말해서, 스크립트 파일 생성은 텍스트 에디터로 코드를 작성하고 .sh 확장자로 저장하는 과정입니다. 왜 제대로 된 저장 방법을 알아야 할까요?

스크립트 파일은 일반 텍스트 파일이지만, 줄바꿈 문자, 인코딩, 파일 권한 등이 잘못되면 실행되지 않습니다. 특히 Windows에서 작성한 파일을 Linux로 옮기면 줄바꿈 문자 차이(\r\n vs \n) 때문에 오류가 발생하는 경우가 많습니다.

실무에서는 이런 기본적인 문제로 시간을 낭비하지 않도록 처음부터 올바른 방법을 익혀야 합니다. 기존에는 Windows 메모장으로 작성했다가 Linux에서 오류가 나는 경우가 많았다면, 이제는 적절한 에디터와 설정을 사용하여 문제를 예방할 수 있습니다.

스크립트 파일 생성의 핵심 특징: 첫째, UTF-8 인코딩을 사용해야 합니다. 둘째, Unix 스타일 줄바꿈(LF)을 사용해야 합니다.

셋째, 의미 있는 파일명과 .sh 확장자를 사용하는 것이 좋습니다. 이런 기본 원칙만 지켜도 대부분의 문제를 예방할 수 있습니다.

코드 예제

# 방법 1: vim 에디터 사용 (서버 환경에서 많이 사용)
vim hello.sh
# i를 눌러 입력 모드 진입
# 코드 작성
# ESC를 누르고 :wq 입력하여 저장 후 종료

# 방법 2: nano 에디터 사용 (초보자에게 친화적)
nano hello.sh
# 코드 작성
# Ctrl+O로 저장, Ctrl+X로 종료

# 방법 3: cat으로 간단히 생성 (한 줄짜리 스크립트)
cat > hello.sh << 'EOF'
#!/bin/bash
echo "Hello World"
EOF

# 방법 4: echo로 한 줄 추가
echo '#!/bin/bash' > hello.sh
echo 'echo "Hello World"' >> hello.sh

설명

이것이 하는 일: 스크립트 파일을 생성하는 것은 텍스트 에디터를 열어 코드를 작성하고, 적절한 이름과 확장자로 저장하는 과정입니다. 첫 번째로, vim은 Unix/Linux 환경에서 가장 널리 사용되는 에디터입니다.

vim hello.sh를 실행하면 vim이 열리고, i 키를 눌러 입력 모드로 들어간 후 코드를 작성합니다. 작성이 끝나면 ESC 키를 누르고 :wq를 입력하여 저장하고 종료합니다.

vim은 강력하지만 처음에는 키 조작이 낯설 수 있습니다. 하지만 서버에 SSH로 접속했을 때는 vim이나 vi만 사용할 수 있는 경우가 많으므로 기본은 알아두는 것이 좋습니다.

그 다음으로, nano는 초보자에게 훨씬 친화적인 에디터입니다. nano hello.sh를 실행하면 화면 하단에 주요 단축키가 표시됩니다.

코드를 작성한 후 Ctrl+O를 눌러 저장하고, Ctrl+X로 종료합니다. vim보다 직관적이어서 처음 Linux를 접하는 사람들에게 권장됩니다.

세 번째 방법인 cat을 사용한 Here Document는 스크립트 안에서 다른 스크립트를 생성할 때 유용합니다. cat > hello.sh << 'EOF'는 "EOF를 만날 때까지의 모든 내용을 hello.sh 파일에 쓰라"는 의미입니다.

작은따옴표로 'EOF'를 감싸면 변수 치환이 일어나지 않아 스크립트 내용이 그대로 저장됩니다. 자동화 스크립트에서 설정 파일이나 다른 스크립트를 생성할 때 자주 사용하는 패턴입니다.

네 번째 방법은 echo를 사용한 간단한 방식입니다. >는 파일을 새로 만들거나 덮어쓰고, >>는 파일 끝에 내용을 추가합니다.

이 방법은 간단한 스크립트를 빠르게 만들 때 유용하지만, 여러 줄의 복잡한 스크립트는 에디터를 사용하는 것이 낫습니다. 여러분이 어떤 방법을 선택하든, 중요한 것은 파일이 올바른 형식으로 저장되는지 확인하는 것입니다.

file hello.sh 명령으로 파일 타입을 확인하면 "ASCII text executable"이나 "Bash script"라고 표시되어야 합니다. 실무에서는 VS Code나 IntelliJ 같은 IDE를 사용할 수도 있는데, 이 경우 에디터 설정에서 줄바꿈을 LF로, 인코딩을 UTF-8로 설정해야 합니다.

실전 팁

💡 VS Code를 사용한다면 우측 하단에서 CRLF를 LF로 변경하세요. "End of Line Sequence"를 클릭하여 설정할 수 있습니다.

💡 파일명은 소문자와 하이픈(-)을 사용하고, 공백은 피하세요. 예: backup-database.shBackup Database.sh보다 좋습니다.

💡 스크립트를 여러 개 만들 때는 scripts/ 디렉토리를 만들어 관리하세요. mkdir -p ~/scripts로 생성할 수 있습니다.

💡 Git으로 버전 관리를 한다면 .sh 파일을 커밋하기 전에 git diff로 줄바꿈이 올바른지 확인하세요.

💡 Windows에서 작성한 파일이라면 dos2unix hello.sh 명령으로 줄바꿈 문자를 변환할 수 있습니다.


4. chmod로 실행 권한 부여

시작하며

여러분이 완벽한 스크립트를 작성하고 저장했는데, ./hello.sh를 실행하니까 "Permission denied" 에러가 났다면? 이것은 Linux 초보자가 겪는 가장 흔한 문제 중 하나입니다.

Linux와 Unix 시스템은 보안을 매우 중요하게 생각합니다. 모든 파일에는 "누가 읽을 수 있고, 누가 쓸 수 있고, 누가 실행할 수 있는지"를 나타내는 권한이 설정되어 있습니다.

새로 만든 텍스트 파일은 기본적으로 읽기와 쓰기만 가능하고, 실행은 불가능합니다. 이것은 마치 여러분이 만든 요리 레시피를 다른 사람들이 볼 수는 있지만, 실제로 요리를 만들 수는 없는 것과 같습니다.

레시피를 요리로 만들려면 "실행 권한"이라는 특별한 허가가 필요합니다. 바로 이때 사용하는 명령어가 chmod(change mode)입니다.

chmod는 파일의 권한을 변경하여 스크립트를 실행 가능하게 만드는 핵심 도구입니다.

개요

간단히 말해서, chmod는 파일의 읽기(read), 쓰기(write), 실행(execute) 권한을 변경하는 명령어입니다. 왜 실행 권한이 필요할까요?

Unix 시스템은 보안 원칙에 따라 명시적으로 허가된 파일만 실행할 수 있게 합니다. 만약 모든 파일이 기본적으로 실행 가능하다면, 악의적인 코드가 담긴 파일을 실수로 다운받았을 때 큰 피해를 입을 수 있습니다.

실무에서는 배포 스크립트, 백업 스크립트, 크론잡 등 자동화된 작업이 제대로 실행되려면 반드시 실행 권한이 있어야 합니다. 기존에는 bash hello.sh처럼 매번 인터프리터를 명시해서 실행했다면, 실행 권한을 부여한 후에는 ./hello.sh만으로 실행할 수 있습니다.

chmod의 핵심 특징: 첫째, 숫자 모드(예: 755)와 기호 모드(예: +x) 두 가지 방식이 있습니다. 둘째, 소유자, 그룹, 기타 사용자별로 권한을 다르게 설정할 수 있습니다.

셋째, 한 번 설정하면 파일이 삭제되거나 권한이 다시 변경될 때까지 유지됩니다. 이런 유연성 덕분에 세밀한 보안 정책을 구현할 수 있습니다.

코드 예제

#!/bin/bash
# 실행 권한을 부여하는 다양한 방법

# 방법 1: 모든 사용자에게 실행 권한 추가 (가장 간단)
chmod +x hello.sh

# 방법 2: 소유자에게만 실행 권한 추가 (더 안전)
chmod u+x hello.sh

# 방법 3: 숫자 모드 사용 (정확한 제어)
chmod 755 hello.sh  # rwxr-xr-x: 소유자는 모든 권한, 다른 사람은 읽기+실행

# 방법 4: 소유자만 모든 권한, 다른 사람은 아무 권한 없음
chmod 700 hello.sh  # rwx------: 보안이 중요한 스크립트

# 권한 확인
ls -l hello.sh
# 출력 예: -rwxr-xr-x 1 user group 123 Nov 17 10:00 hello.sh

설명

이것이 하는 일: chmod는 파일의 권한 비트를 변경하여 누가 파일을 읽고, 쓰고, 실행할 수 있는지 제어합니다. 첫 번째로, chmod +x hello.sh는 가장 간단한 방법으로, 모든 사용자(소유자, 그룹, 기타)에게 실행 권한을 추가합니다.

+는 "추가하다"는 의미이고, x는 "실행(execute)"을 의미합니다. 기존 권한은 그대로 유지하면서 실행 권한만 추가하므로 가장 안전하고 일반적인 방법입니다.

개인 프로젝트나 간단한 스크립트에 적합합니다. 그 다음으로, chmod u+x hello.sh는 소유자(user)에게만 실행 권한을 추가합니다.

u는 파일 소유자, g는 그룹, o는 기타 사용자를 의미합니다. 이 방법은 여러 사용자가 있는 서버 환경에서 더 안전합니다.

다른 사람들은 여러분의 스크립트를 실행할 수 없지만, 읽을 수는 있습니다(읽기 권한이 있다면). 세 번째 방법인 숫자 모드 chmod 755 hello.sh는 더 정밀한 제어를 제공합니다.

755는 rwxr-xr-x를 의미하는데, 각 숫자는 3비트로 구성됩니다: 4(읽기) + 2(쓰기) + 1(실행). 따라서 7(4+2+1)은 모든 권한, 5(4+1)는 읽기+실행 권한입니다.

첫 번째 숫자는 소유자, 두 번째는 그룹, 세 번째는 기타 사용자의 권한입니다. 이 방법은 정확히 원하는 권한을 한 번에 설정할 수 있어서 실무에서 자주 사용됩니다.

네 번째 예시인 chmod 700 hello.sh는 보안이 매우 중요한 스크립트에 사용합니다. 700은 rwx------를 의미하여, 오직 소유자만 읽고, 쓰고, 실행할 수 있습니다.

다른 사람들은 파일의 존재조차 확인할 수 없습니다. 비밀번호가 포함된 스크립트, API 키를 사용하는 스크립트, 중요한 데이터를 다루는 스크립트에 적합합니다.

마지막 ls -l hello.sh 명령은 설정한 권한을 확인합니다. 출력의 첫 부분인 -rwxr-xr-x에서 첫 문자는 파일 타입(- = 일반 파일, d = 디렉토리), 다음 3문자는 소유자 권한(rwx), 그 다음 3문자는 그룹 권한(r-x), 마지막 3문자는 기타 사용자 권한(r-x)입니다.

여러분이 chmod를 올바르게 사용하면 스크립트를 안전하게 관리하고, 의도하지 않은 실행을 방지하며, 팀 환경에서 협업할 때 권한 관련 문제를 피할 수 있습니다. 실무에서는 CI/CD 파이프라인에서 배포 스크립트에 자동으로 실행 권한을 부여하거나, 도커 이미지를 빌드할 때 엔트리포인트 스크립트에 권한을 설정하는 등 다양하게 활용됩니다.

실전 팁

💡 chmod +x가 가장 간단하지만, 멀티유저 환경에서는 chmod 750처럼 구체적으로 지정하는 것이 안전합니다.

💡 디렉토리에 실행 권한을 주면 그 안으로 들어갈(cd) 수 있습니다. chmod +x mydir로 설정하세요.

💡 여러 파일에 한 번에 권한을 주려면: chmod +x *.sh로 모든 .sh 파일에 권한을 부여할 수 있습니다.

💡 권한을 변경하기 전에 ls -l로 현재 권한을 확인하는 습관을 들이세요. 잘못된 권한 설정은 보안 문제를 일으킬 수 있습니다.

💡 Git에서는 git update-index --chmod=+x script.sh로 실행 권한을 추적할 수 있습니다. 이렇게 하면 저장소를 클론한 다른 사람도 같은 권한을 갖습니다.


5. 스크립트 실행 방법 (./script.sh)

시작하며

여러분이 스크립트를 만들고 실행 권한까지 부여했습니다. 이제 실제로 실행할 차례인데, 왜 hello.sh가 아니라 ./hello.sh로 실행해야 할까요?

초보자들이 가장 헷갈려하는 부분입니다. 터미널에서 hello.sh를 입력하면 "command not found" 에러가 나는 경우가 많습니다.

분명히 파일은 현재 디렉토리에 있는데 왜 찾지 못할까요? 이것은 Linux의 보안 메커니즘과 관련이 있습니다.

Linux는 PATH라는 환경 변수에 등록된 디렉토리에서만 명령어를 찾습니다. 현재 디렉토리(.)는 보안상의 이유로 기본 PATH에 포함되어 있지 않습니다.

만약 포함되어 있다면, 악의적인 사용자가 'ls'라는 이름의 악성 스크립트를 만들어두고, 여러분이 ls 명령을 실행했을 때 진짜 ls 대신 악성 코드가 실행될 수 있습니다. 그래서 현재 디렉토리의 스크립트를 실행하려면 명시적으로 "./script.sh"라고 입력해야 합니다.

이제 여러 가지 실행 방법을 알아보겠습니다.

개요

간단히 말해서, 스크립트 실행은 ./script.sh처럼 경로를 포함하여 스크립트를 실행하거나, bash script.sh처럼 인터프리터를 명시하는 방법이 있습니다. 왜 다양한 실행 방법을 알아야 할까요?

상황에 따라 적절한 실행 방법이 다르기 때문입니다. 실행 권한이 없는 스크립트는 bash script.sh로만 실행할 수 있고, PATH에 등록된 스크립트는 파일명만으로 실행할 수 있습니다.

실무에서는 개발 중에는 bash script.sh로 테스트하고, 배포할 때는 실행 권한을 주고 ./script.sh로 실행하거나, 시스템 전체에서 사용할 스크립트는 /usr/local/bin에 복사하여 어디서든 실행 가능하게 만듭니다. 기존에는 스크립트를 실행하려면 정확한 경로를 알아야 했다면, 이제는 PATH 설정을 통해 어디서든 간편하게 실행할 수 있습니다.

스크립트 실행의 핵심 특징: 첫째, ./는 현재 디렉토리를 의미합니다. 둘째, Shebang이 있고 실행 권한이 있으면 직접 실행 가능합니다.

셋째, bash script.sh는 Shebang과 실행 권한 없이도 작동합니다. 이런 차이를 이해하면 다양한 환경에서 유연하게 스크립트를 실행할 수 있습니다.

코드 예제

#!/bin/bash
# 스크립트를 실행하는 다양한 방법

# 방법 1: 현재 디렉토리에서 실행 (가장 일반적)
./hello.sh

# 방법 2: 절대 경로로 실행
/home/user/scripts/hello.sh

# 방법 3: bash 명령으로 실행 (실행 권한 불필요)
bash hello.sh

# 방법 4: source 또는 .으로 실행 (현재 셸에서 실행)
source hello.sh
# 또는
. hello.sh

# 방법 5: PATH에 추가하여 어디서든 실행
export PATH="$PATH:$HOME/scripts"
hello.sh  # 이제 디렉토리 이름 없이 실행 가능

# 백그라운드로 실행
./hello.sh &

# 입력을 파일에서 받아 실행
./hello.sh < input.txt

# 출력을 파일로 저장
./hello.sh > output.txt

설명

이것이 하는 일: 스크립트를 실행하는 것은 운영체제가 스크립트 파일을 읽고, 그 안의 명령들을 순서대로 실행하는 과정입니다. 첫 번째로, ./hello.sh는 현재 디렉토리(./)에 있는 hello.sh 파일을 실행하라는 의미입니다.

점(.)은 현재 디렉토리를 나타내는 특별한 기호입니다. 이 방법을 사용하려면 파일에 실행 권한이 있어야 하고, Shebang 라인이 있어야 합니다.

운영체제는 Shebang을 읽고 적절한 인터프리터로 스크립트를 실행합니다. 이것이 가장 표준적이고 권장되는 실행 방법입니다.

그 다음으로, 절대 경로 /home/user/scripts/hello.sh를 사용하면 어떤 디렉토리에서든 그 스크립트를 실행할 수 있습니다. 절대 경로는 루트(/)에서부터 시작하는 전체 경로입니다.

크론잡이나 자동화 스크립트에서는 항상 절대 경로를 사용해야 합니다. 왜냐하면 작업 디렉토리가 어디인지 보장할 수 없기 때문입니다.

세 번째 방법인 bash hello.sh는 bash 인터프리터를 직접 호출하여 스크립트를 실행합니다. 이 방법의 장점은 실행 권한이 없어도 작동한다는 것입니다.

Shebang도 무시되고, 항상 bash로 실행됩니다. 개발 중에 테스트할 때나, 권한을 변경할 수 없는 환경에서 유용합니다.

Python 스크립트라면 python3 script.py처럼 사용할 수 있습니다. 네 번째 방법인 source hello.sh 또는 `.

hello.sh`는 특별합니다. 일반적인 실행과 달리, 새로운 프로세스를 만들지 않고 현재 셸에서 직접 실행합니다.

이것은 스크립트 안에서 설정한 환경 변수나 함수가 현재 셸에 남아있게 만듭니다. 예를 들어, 스크립트에서 export MY_VAR="value"를 설정하면, source로 실행한 경우에만 현재 셸에서 echo $MY_VAR로 그 값을 볼 수 있습니다.

환경 설정 스크립트나 .bashrc 같은 파일을 실행할 때 사용합니다. 다섯 번째 방법은 PATH 환경 변수에 스크립트가 있는 디렉토리를 추가하는 것입니다.

export PATH="$PATH:$HOME/scripts"를 실행하면, ~/scripts 디렉토리가 PATH에 추가됩니다. 이제 hello.sh만 입력해도 시스템이 자동으로 ~/scripts/hello.sh를 찾아서 실행합니다.

자주 사용하는 스크립트는 ~/bin이나 ~/.local/bin 디렉토리에 넣고 PATH에 추가하면 편리합니다. 추가 팁으로, ./hello.sh &처럼 끝에 &를 붙이면 백그라운드에서 실행됩니다.

시간이 오래 걸리는 작업을 실행하고 터미널을 계속 사용하고 싶을 때 유용합니다. ./hello.sh < input.txt는 input.txt의 내용을 스크립트의 표준 입력으로 전달하고, ./hello.sh > output.txt는 스크립트의 출력을 output.txt 파일로 저장합니다.

여러분이 이런 다양한 실행 방법을 이해하면, 상황에 맞는 최적의 방법을 선택할 수 있습니다. 실무에서는 개발 환경, 테스트 환경, 프로덕션 환경마다 다른 실행 방식을 사용하며, CI/CD 파이프라인에서도 이런 지식이 필수적입니다.

실전 팁

💡 자주 사용하는 스크립트는 ~/bin 디렉토리를 만들고 PATH에 추가하세요: mkdir ~/bin && export PATH="$PATH:$HOME/bin"

💡 스크립트 실행 시 에러가 나면 bash -x script.sh로 디버그 모드로 실행하여 각 줄의 실행 과정을 볼 수 있습니다.

💡 다른 디렉토리에서 스크립트를 실행할 때 스크립트 내부의 상대 경로가 문제가 될 수 있습니다. cd "$(dirname "$0")"를 스크립트 첫 부분에 추가하여 스크립트가 있는 디렉토리로 이동하세요.

💡 실행 권한이 있는지 확실하지 않다면 bash script.sh로 실행하는 것이 안전합니다. 권한 문제를 우회할 수 있습니다.

💡 원격 서버의 스크립트를 로컬에서 실행하려면: ssh user@server 'bash -s' < local_script.sh처럼 SSH를 통해 파이프할 수 있습니다.


6. 주석 작성 규칙

시작하며

여러분이 6개월 전에 작성한 스크립트를 다시 열어봤는데, "이 코드가 왜 여기 있지?"라고 생각한 적 있나요? 혹은 동료가 작성한 복잡한 스크립트를 이해하느라 몇 시간을 낭비한 적은요?

코드는 한 번 쓰지만 여러 번 읽힙니다. 특히 Bash 스크립트는 간결한 문법 때문에 복잡한 로직이 한 줄에 압축되기 쉽습니다.

find . -name "*.log" -mtime +30 -exec rm {} \; 같은 명령을 처음 보는 사람이 무슨 뜻인지 바로 알 수 있을까요?

주석은 코드가 "무엇을 하는지(What)"뿐만 아니라 "왜 그렇게 하는지(Why)"를 설명합니다. 좋은 주석은 미래의 여러분과 동료 개발자들에게 보내는 친절한 편지와 같습니다.

Bash 스크립트에서 주석 작성은 단순히 #을 붙이는 것 이상입니다. 어떤 정보를 어떻게 전달할지, 어떤 형식을 따를지에 대한 모범 사례가 있습니다.

개요

간단히 말해서, Bash에서 주석은 #으로 시작하며, 그 줄의 나머지 부분은 실행되지 않고 무시됩니다. 왜 주석이 중요할까요?

코드 자체는 "어떻게(How)"를 설명하지만, "왜(Why)"는 설명하지 못합니다. 실무에서는 비즈니스 로직, 해결하려는 문제, 특정 방법을 선택한 이유 등을 주석으로 남겨야 합니다.

예를 들어, 30일 이상 된 로그를 삭제하는 코드가 있다면, "디스크 공간 절약을 위해 30일 이상 된 로그는 삭제" 같은 주석이 있으면 나중에 "왜 30일이지?"라는 질문에 답할 수 있습니다. 기존에는 주석 없이 코드만 작성했다가 나중에 이해하지 못해 고생했다면, 이제는 적절한 주석으로 코드의 의도를 명확히 할 수 있습니다.

주석 작성의 핵심 원칙: 첫째, 코드가 무엇을 하는지보다 왜 그렇게 하는지를 설명합니다. 둘째, 복잡한 로직, 해결 방법, 임시 해결책(workaround)에는 반드시 주석을 답니다.

셋째, 파일 상단에는 스크립트의 목적, 작성자, 사용법을 설명하는 헤더 주석을 작성합니다. 이런 원칙들이 코드의 가독성과 유지보수성을 크게 향상시킵니다.

코드 예제

#!/bin/bash
################################################################################
# 스크립트 이름: backup_database.sh
# 작성자: 홍길동 (hong@example.com)
# 작성일: 2025-11-17
# 설명: PostgreSQL 데이터베이스를 백업하고 S3에 업로드합니다.
# 사용법: ./backup_database.sh [database_name]
# 의존성: aws-cli, postgresql-client
################################################################################

# 설정 변수
DB_NAME="${1:-production}"  # 첫 번째 인자, 없으면 'production' 사용
BACKUP_DIR="/var/backups/db"
S3_BUCKET="s3://my-company-backups"

# 백업 디렉토리가 없으면 생성
# FIXME: 권한 문제 발생 가능, 관리자 권한 필요
mkdir -p "$BACKUP_DIR"

# 현재 날짜를 파일명에 포함 (예: backup_2025-11-17.sql)
TIMESTAMP=$(date +%Y-%m-%d)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$TIMESTAMP.sql"

# 데이터베이스 덤프 생성
# NOTE: --no-owner 옵션은 다른 서버로 복원할 때 소유권 문제를 방지
pg_dump --no-owner "$DB_NAME" > "$BACKUP_FILE"

# TODO: 암호화 기능 추가 필요
# 백업 파일을 S3에 업로드
aws s3 cp "$BACKUP_FILE" "$S3_BUCKET/"

# 30일 이상 된 로컬 백업 삭제 (디스크 공간 절약)
find "$BACKUP_DIR" -name "*.sql" -mtime +30 -delete

설명

이것이 하는 일: 주석은 코드의 실행에는 영향을 주지 않지만, 사람이 코드를 이해하는 데 필수적인 정보를 제공합니다. 첫 번째로, 파일 상단의 헤더 주석은 스크립트 전체에 대한 개요를 제공합니다.

스크립트 이름, 작성자, 작성일, 설명, 사용법, 의존성 등을 포함합니다. 이것은 마치 책의 서문과 같아서, 누군가 이 스크립트를 처음 볼 때 빠르게 전체적인 맥락을 파악할 수 있게 해줍니다.

실무에서는 특히 팀 프로젝트나 오픈소스에서 이런 헤더 주석이 매우 중요합니다. 그 다음으로, 변수 선언 부분의 주석은 각 변수의 목적을 설명합니다.

DB_NAME="${1:-production}"라는 코드만 봐서는 기본값이 'production'이라는 것은 알 수 있지만, 왜 그런지는 알 수 없습니다. "첫 번째 인자, 없으면 'production' 사용"이라는 주석이 있으면 훨씬 명확합니다.

세 번째로, # FIXME: 주석은 현재 코드에 문제가 있거나 개선이 필요한 부분을 표시합니다. FIXME는 "이것은 제대로 작동하지 않거나 나중에 수정해야 함"을 의미합니다.

예를 들어, "권한 문제 발생 가능, 관리자 권한 필요"라는 FIXME는 이 부분이 잠재적 문제가 있음을 경고합니다. 이런 표시는 IDE에서 하이라이트되어 쉽게 찾을 수 있습니다.

네 번째로, # NOTE: 주석은 중요한 정보나 주의사항을 표시합니다. --no-owner 옵션을 왜 사용하는지 설명하는 NOTE는 나중에 이 옵션을 제거하려는 사람이 "잠깐, 이건 이유가 있어서 넣은 거구나"라고 깨닫게 해줍니다.

다섯 번째로, # TODO: 주석은 미래에 구현해야 할 기능을 표시합니다. "암호화 기능 추가 필요"라는 TODO는 현재는 구현되지 않았지만, 다음 버전에서 추가해야 할 기능임을 나타냅니다.

이런 TODO 주석을 관리하는 도구도 많이 있어서, 프로젝트의 남은 작업을 쉽게 추적할 수 있습니다. 마지막 줄의 주석 "디스크 공간 절약"은 왜 30일 이상 된 백업을 삭제하는지 이유를 설명합니다.

코드 자체는 "30일 이상 된 .sql 파일을 삭제한다"는 것만 보여주지만, 주석은 "왜 30일인지", "왜 삭제하는지"를 설명합니다. 여러분이 이런 주석 작성 규칙을 따르면, 6개월 후에 코드를 다시 봐도 빠르게 이해할 수 있고, 다른 사람들과 협업할 때도 원활하게 소통할 수 있습니다.

실무에서는 코드 리뷰 시 주석이 충분한지 확인하고, 복잡한 로직에는 반드시 주석을 요구하는 경우가 많습니다.

실전 팁

💡 "무엇을" 하는지는 코드가 말하게 하고, "왜" 하는지를 주석으로 설명하세요. # i를 1 증가시킴 같은 뻔한 주석은 불필요합니다.

💡 TODO, FIXME, NOTE, HACK 같은 키워드를 사용하면 IDE에서 하이라이트되어 쉽게 찾을 수 있습니다. 일관된 키워드를 사용하세요.

💡 임시 해결책(workaround)에는 반드시 주석을 달고, 왜 이렇게 했는지와 언제 제거할 수 있는지를 명시하세요.

💡 복잡한 정규표현식이나 awk/sed 명령에는 예시 입력과 출력을 주석으로 추가하면 이해하기 쉽습니다.

💡 스크립트가 외부 서비스(API, 데이터베이스)와 상호작용한다면, 에러 처리 부분에 어떤 에러가 발생할 수 있는지 주석으로 설명하세요.


#Bash#Shell Script#Linux#Shebang#chmod#Linux,Bash,Shell

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.