이미지 로딩 중...

Bash 스크립트 완벽 입문 가이드 - 슬라이드 1/7
A

AI Generated

2025. 11. 17. · 3 Views

Bash 스크립트 완벽 입문 가이드

초급 개발자를 위한 Bash 스크립트의 기초부터 실무 활용까지! Bash 쉘의 개념, 역사, 설치부터 개발 환경 설정, PATH 환경변수, 실행 권한까지 실무에 필요한 모든 것을 쉽고 친근하게 배워보세요.


목차

  1. Bash 쉘이란 무엇인가?
  2. 쉘 스크립트의 역사와 활용
  3. Bash 버전 확인 및 설치
  4. 개발 환경 설정 (에디터, 터미널)
  5. PATH 환경변수 이해하기
  6. 스크립트 실행 권한 설정

1. Bash 쉘이란 무엇인가?

시작하며

여러분이 컴퓨터로 작업할 때 항상 마우스로 클릭하고, 폴더를 열고, 파일을 드래그하는 게 불편하다고 느낀 적 있나요? 예를 들어, 100개의 파일 이름을 한꺼번에 바꿔야 한다거나, 매일 반복되는 작업을 자동화하고 싶을 때 말이죠.

이런 문제는 실제 개발 현장에서 매일같이 발생합니다. 수동으로 하나하나 클릭하다 보면 시간도 오래 걸리고, 실수도 생기기 쉽습니다.

특히 서버 관리나 배포 작업처럼 반복적인 일을 할 때는 더욱 비효율적이죠. 바로 이럴 때 필요한 것이 Bash 쉘입니다.

마치 컴퓨터에게 직접 말을 걸어 명령을 내리는 것처럼, 텍스트로 원하는 작업을 빠르고 정확하게 수행할 수 있게 해줍니다.

개요

간단히 말해서, Bash는 여러분과 컴퓨터 사이의 "통역사"입니다. 여러분이 입력한 명령어를 컴퓨터가 이해할 수 있는 언어로 번역해서 실행해주는 프로그램이에요.

Bash가 필요한 이유는 명확합니다. GUI(그래픽 인터페이스)로는 한계가 있는 작업들을 텍스트 명령어로 빠르게 처리할 수 있기 때문입니다.

예를 들어, 특정 확장자를 가진 파일 1000개를 찾아서 다른 폴더로 옮기는 작업을 마우스로 하면 몇 시간이 걸리지만, Bash로는 단 한 줄의 명령어로 몇 초 만에 끝낼 수 있습니다. 기존에는 마우스로 클릭하고 드래그하며 작업했다면, 이제는 명령어 한 줄로 수백 개의 파일을 동시에 처리할 수 있습니다.

마치 마법사가 주문을 외우듯이요! Bash의 핵심 특징은 크게 세 가지입니다.

첫째, 명령어를 순차적으로 실행할 수 있어서 복잡한 작업을 자동화할 수 있습니다. 둘째, 변수와 조건문을 사용해서 똑똑한 스크립트를 만들 수 있습니다.

셋째, 다른 프로그램들을 연결해서 강력한 작업 흐름을 만들 수 있습니다. 이러한 특징들이 개발자의 생산성을 몇 배로 높여주는 이유입니다.

코드 예제

# 기본적인 Bash 명령어 예제
# 현재 날짜와 시간을 확인합니다
echo "현재 시간: $(date)"

# 현재 디렉토리의 파일 목록을 봅니다
echo "파일 목록:"
ls -l

# 간단한 변수 사용
name="개발자"
echo "안녕하세요, $name님!"

# 조건문 사용 예제
if [ -f "test.txt" ]; then
    echo "test.txt 파일이 존재합니다."
else
    echo "test.txt 파일이 없습니다."
fi

설명

이것이 하는 일: Bash 쉘은 사용자가 입력한 명령어를 읽고, 해석하고, 실행하는 프로그램입니다. 마치 레스토랑의 웨이터가 손님의 주문을 받아서 주방에 전달하는 것처럼, 여러분의 명령을 운영체제에 전달하는 역할을 합니다.

첫 번째로, echo 명령어는 화면에 텍스트를 출력하는 가장 기본적인 명령입니다. $(date) 부분은 "명령어 치환"이라고 하는데, date 명령어의 결과를 그 자리에 넣어준다는 의미입니다.

마치 수학 공식에서 괄호 안을 먼저 계산하는 것과 비슷하죠. 그 다음으로, ls -l 명령어가 실행되면서 현재 폴더에 있는 모든 파일과 폴더의 상세 정보를 보여줍니다.

-l은 "옵션"이라고 하는데, 명령어에게 "상세하게 보여줘"라고 추가 지시를 내리는 것입니다. 변수 name에 "개발자"라는 값을 저장하고, $name으로 그 값을 꺼내서 사용할 수 있습니다.

마지막 부분의 if 문은 조건을 검사합니다. -f "test.txt"는 "test.txt라는 파일이 존재하는가?"를 확인하는 조건입니다.

존재하면 첫 번째 메시지를, 없으면 두 번째 메시지를 출력합니다. 이렇게 Bash는 상황에 따라 다른 행동을 할 수 있는 똑똑한 프로그램입니다.

여러분이 이 코드를 사용하면 Bash의 기본 문법을 이해하고, 간단한 자동화 스크립트를 작성할 수 있게 됩니다. 파일 존재 여부 확인, 변수 활용, 조건 분기 등은 실무에서 가장 자주 사용하는 패턴들입니다.

이 기초만 잘 다져도 복잡한 서버 관리 작업이나 배포 스크립트를 작성할 수 있습니다.

실전 팁

💡 처음에는 echo 명령어로 모든 것을 출력해보세요. 변수의 값이 제대로 들어갔는지, 명령어가 어떻게 실행되는지 눈으로 확인하면서 배우는 게 가장 빠릅니다.

💡 흔한 실수: $namename을 헷갈리지 마세요. $가 붙어야 변수의 "값"을 가져옵니다. $ 없이 쓰면 그냥 "name"이라는 글자가 출력됩니다.

💡 명령어를 실행하기 전에 echo 명령어로 먼저 확인해보세요. 예를 들어 rm -rf * 같은 위험한 명령어는 echo rm -rf *로 먼저 테스트해서 어떤 파일이 삭제될지 확인하면 안전합니다.

💡 Bash는 대소문자를 구분합니다. Namename은 완전히 다른 변수입니다. 일관성 있게 소문자로 쓰는 습관을 들이는 게 좋습니다.

💡 한 줄이 너무 길면 백슬래시(\)로 줄바꿈할 수 있습니다. 가독성을 위해 긴 명령어는 여러 줄로 나눠서 작성하세요.


2. 쉘 스크립트의 역사와 활용

시작하며

여러분이 매일 아침 출근해서 똑같은 작업을 반복한다고 상상해보세요. 서버 로그를 확인하고, 데이터베이스를 백업하고, 보고서를 생성하는 일을요.

이걸 매번 손으로 한다면 얼마나 지루하고 실수하기 쉬울까요? 이런 문제는 1970년대 유닉스 개발자들도 똑같이 겪었습니다.

그래서 그들은 "스크립트"라는 개념을 만들었습니다. 명령어들을 파일에 저장해두고, 필요할 때마다 한 번에 실행하는 방식이죠.

바로 이것이 쉘 스크립트의 시작입니다. 50년이 넘는 시간 동안 발전해온 이 기술은 오늘날에도 클라우드, DevOps, 데이터 엔지니어링 등 모든 분야에서 필수적으로 사용되고 있습니다.

개요

간단히 말해서, 쉘 스크립트는 "명령어들의 레시피"입니다. 요리 레시피에 재료와 순서가 적혀있듯이, 스크립트 파일에는 컴퓨터가 수행할 작업들이 순서대로 적혀있습니다.

쉘 스크립트가 필요한 이유는 "자동화"입니다. 한 번 스크립트를 작성해두면 몇 번이고 반복해서 사용할 수 있고, 팀원들과 공유할 수도 있습니다.

예를 들어, 개발 환경을 설정하는 작업처럼 복잡하고 오래 걸리는 일을 스크립트로 만들어두면, 신입 개발자가 입사했을 때 클릭 한 번으로 모든 설정을 자동으로 완료할 수 있습니다. 역사를 보면 1971년 Ken Thompson이 만든 Thompson Shell이 최초의 유닉스 쉘이었습니다.

1977년에는 Stephen Bourne이 Bourne Shell(sh)을 만들었고, 1989년에 Brian Fox가 Bash(Bourne Again Shell)를 개발했습니다. Bash는 Bourne Shell의 기능을 모두 포함하면서도 더 많은 기능을 추가한 "업그레이드 버전"입니다.

오늘날 쉘 스크립트는 서버 관리, CI/CD 파이프라인, 데이터 처리, 시스템 모니터링 등 IT 인프라의 모든 곳에서 사용됩니다. AWS, Google Cloud, Azure 같은 클라우드 플랫폼에서도 쉘 스크립트는 핵심 도구입니다.

이것이 왜 모든 개발자가 Bash를 배워야 하는지 보여주는 증거입니다.

코드 예제

#!/bin/bash
# 웹사이트 백업 자동화 스크립트 예제

# 현재 날짜를 백업 파일명에 사용
backup_date=$(date +%Y%m%d_%H%M%S)
backup_dir="/backup"
source_dir="/var/www/html"

# 백업 디렉토리가 없으면 생성
mkdir -p "$backup_dir"

# tar로 압축하여 백업 생성
echo "백업 시작: $backup_date"
tar -czf "$backup_dir/website_backup_$backup_date.tar.gz" "$source_dir"

# 백업 성공 여부 확인
if [ $? -eq 0 ]; then
    echo "백업 완료: $backup_dir/website_backup_$backup_date.tar.gz"
    # 30일 이상 된 백업 파일 자동 삭제
    find "$backup_dir" -name "website_backup_*.tar.gz" -mtime +30 -delete
    echo "오래된 백업 파일 정리 완료"
else
    echo "백업 실패! 관리자에게 연락하세요."
    exit 1
fi

설명

이것이 하는 일: 이 스크립트는 웹사이트 파일을 자동으로 백업하고, 오래된 백업 파일을 정리하는 실무에서 자주 사용하는 패턴입니다. 매일 자동으로 실행되도록 cron에 등록하면 백업 걱정 없이 안심할 수 있습니다.

첫 번째로, #!/bin/bash는 "셔뱅(shebang)"이라고 부르는 특별한 줄입니다. 이 스크립트를 실행할 때 어떤 프로그램(인터프리터)을 사용할지 지정합니다.

마치 워드 문서 확장자가 .docx인 것처럼, 이 파일은 Bash로 실행되어야 한다고 선언하는 것입니다. 변수 부분에서는 date 명령어로 현재 시각을 "20250117_143025" 같은 형식으로 만들어서 파일명에 사용합니다.

그 다음으로, mkdir -p는 디렉토리를 생성하는 명령인데, -p 옵션을 붙이면 "이미 존재해도 에러 내지 마"라는 의미입니다. 안전한 스크립트 작성의 핵심 패턴입니다.

tar -czf 명령어는 파일들을 하나로 모아서 압축하는 작업을 합니다. -c는 생성(create), -z는 gzip 압축, -f는 파일명 지정을 의미합니다.

$?는 마지막 명령어의 실행 결과를 담고 있는 특수 변수입니다. 0이면 성공, 0이 아니면 실패를 의미합니다.

이것으로 백업이 제대로 됐는지 확인하고, 성공했을 때만 오래된 파일을 삭제합니다. find 명령어의 -mtime +30은 "30일보다 오래된"이라는 조건입니다.

마지막으로, exit 1은 스크립트를 에러 상태로 종료하는 명령입니다. 이렇게 하면 이 스크립트를 호출한 다른 프로그램이 "아, 백업이 실패했구나"를 알 수 있습니다.

실무에서는 이런 에러 처리가 매우 중요합니다. 여러분이 이 코드를 사용하면 수동 백업의 번거로움에서 완전히 해방됩니다.

매일 밤 자동으로 백업되고, 디스크 공간도 자동으로 관리되며, 문제가 생기면 즉시 알림을 받을 수 있습니다. 이것이 바로 쉘 스크립트의 힘입니다.

한 번 작성하면 영원히 일해주는 디지털 비서를 얻는 셈이죠.

실전 팁

💡 스크립트 첫 줄에는 항상 #!/bin/bash를 넣으세요. 이게 없으면 다른 쉘에서 실행될 수 있어서 예상치 못한 오류가 발생할 수 있습니다.

💡 변수를 사용할 때는 "$variable" 처럼 큰따옴표로 감싸세요. 공백이 포함된 파일명을 다룰 때 오류를 방지할 수 있습니다. 예: "My Documents"는 한 개의 인자로, 따옴표 없으면 두 개로 인식됩니다.

💡 중요한 작업 전에는 항상 echo로 어떤 명령어가 실행될지 먼저 확인하세요. 특히 삭제(rm)나 이동(mv) 명령어는 실행 전 dry-run으로 테스트하는 습관을 들이세요.

💡 스크립트에는 주석을 충분히 달아두세요. 3개월 후에 자기가 쓴 스크립트를 못 알아보는 경우가 정말 많습니다. "왜 이렇게 했는지"를 기록해두면 나중에 큰 도움이 됩니다.

💡 에러 처리는 필수입니다. set -e 옵션을 스크립트 상단에 추가하면 중간에 에러가 발생하면 즉시 중단됩니다. 잘못된 상태로 계속 실행되는 것을 막을 수 있어요.


3. Bash 버전 확인 및 설치

시작하며

여러분이 새로운 프로젝트를 시작했는데, 팀원의 컴퓨터에서는 스크립트가 잘 돌아가는데 여러분 컴퓨터에서는 에러가 난다면 어떨까요? "내 컴퓨터에서는 잘 되는데..."라는 말은 개발자들 사이에서 농담처럼 쓰이지만, 실제로는 심각한 문제입니다.

이런 문제의 가장 흔한 원인 중 하나가 바로 "버전 차이"입니다. Bash도 프로그램이기 때문에 계속 업데이트되고 있고, 새로운 기능이 추가되거나 버그가 수정됩니다.

오래된 버전에서는 최신 문법이 동작하지 않을 수 있습니다. 바로 이럴 때 필요한 것이 버전 확인과 올바른 설치입니다.

자신의 환경을 정확히 파악하고, 필요하다면 최신 버전으로 업데이트하는 것이 안정적인 개발의 첫걸음입니다.

개요

간단히 말해서, Bash 버전 확인은 "내 컴퓨터에 어떤 Bash가 깔려있는지" 알아보는 작업입니다. 마치 스마트폰의 iOS나 안드로이드 버전을 확인하는 것과 같습니다.

버전 확인이 왜 중요한가 하면, Bash 4.0 이상에서만 동작하는 기능들이 있기 때문입니다. 예를 들어, 연관 배열(associative arrays)은 Bash 4.0부터 지원됩니다.

macOS는 기본적으로 오래된 Bash 3.2가 설치되어 있어서 최신 스크립트가 동작하지 않을 수 있습니다. 이럴 때는 직접 최신 버전을 설치해야 합니다.

기존에는 "설치된 걸 그냥 쓰면 되지"라고 생각했다면, 이제는 "내 환경에 맞는 버전인지 확인하고 필요하면 업데이트"하는 습관을 들여야 합니다. 이것이 프로 개발자의 자세입니다.

Bash는 운영체제마다 설치 방법이 다릅니다. Linux는 대부분 최신 버전이 기본 설치되어 있고, macOS는 Homebrew로 설치하며, Windows는 WSL(Windows Subsystem for Linux)이나 Git Bash를 사용합니다.

각 환경의 특성을 이해하면 어디서든 Bash를 사용할 수 있습니다.

코드 예제

# Bash 버전 확인하는 여러 가지 방법

# 방법 1: 가장 간단한 버전 확인
bash --version

# 방법 2: 현재 실행 중인 Bash의 버전 (환경변수 사용)
echo "Bash 버전: $BASH_VERSION"

# 방법 3: 버전 비교를 위한 스크립트
if [ "${BASH_VERSINFO[0]}" -ge 4 ]; then
    echo "Bash 4 이상입니다. 최신 기능 사용 가능!"
else
    echo "Bash 3 이하입니다. 업데이트를 권장합니다."
fi

# macOS에서 Homebrew로 최신 Bash 설치하기
# brew install bash

# Ubuntu/Debian에서 업데이트하기
# sudo apt update && sudo apt install bash

# 설치된 Bash의 경로 확인
which bash

# 기본 쉘 변경 (선택사항)
# chsh -s /usr/local/bin/bash

설명

이것이 하는 일: 이 코드는 현재 시스템의 Bash 버전을 확인하고, 필요한 최소 버전을 만족하는지 검사하는 방법을 보여줍니다. 실무에서는 스크립트 시작 부분에 버전 체크를 넣어서 호환성 문제를 미리 방지합니다.

첫 번째로, bash --version 명령어는 Bash의 상세한 버전 정보를 출력합니다. "GNU bash, version 5.1.16(1)-release"같은 형태로 나오는데, 여기서 5.1.16이 실제 버전 번호입니다.

이 명령어는 새 터미널을 열어서 Bash를 실행하기 때문에, 현재 쉘이 아니더라도 시스템에 설치된 Bash 버전을 확인할 수 있습니다. 그 다음으로, $BASH_VERSION 환경변수는 현재 실행 중인 Bash 세션의 버전을 담고 있습니다.

이것은 스크립트 안에서 사용하기 좋습니다. $BASH_VERSINFO는 배열 형태로 버전 정보를 제공하는데, BASH_VERSINFO[0]은 메이저 버전 번호(4나 5 같은 숫자)만 가져옵니다.

-ge는 "greater than or equal(크거나 같다)"을 의미하는 비교 연산자입니다. 숫자를 비교할 때 사용합니다.

이 조건문으로 스크립트가 요구하는 최소 버전을 체크하고, 부족하면 사용자에게 경고 메시지를 보여줄 수 있습니다. which bash 명령어는 Bash 실행 파일이 어디에 설치되어 있는지 경로를 알려줍니다.

macOS에서 Homebrew로 설치하면 /usr/local/bin/bash에 설치되는데, 시스템 기본 Bash는 /bin/bash에 있습니다. 경로를 확인해야 어떤 버전을 사용하고 있는지 정확히 알 수 있습니다.

여러분이 이 코드를 사용하면 스크립트 호환성 문제를 사전에 방지할 수 있습니다. 팀원들이 다른 버전을 사용하더라도 스크립트 시작 부분에 버전 체크를 넣어두면, "내 컴퓨터에서는 안 돼요" 같은 문제를 빠르게 해결할 수 있습니다.

또한 CI/CD 파이프라인에서도 일관된 환경을 보장할 수 있어서 배포 안정성이 높아집니다.

실전 팁

💡 스크립트를 배포하기 전에 꼭 버전 요구사항을 문서화하세요. README에 "Bash 4.0 이상 필요"라고 명시하면 사용자들이 미리 준비할 수 있습니다.

💡 macOS 사용자는 주의하세요! 기본 설치된 Bash 3.2는 2007년 버전입니다. brew install bash로 최신 버전을 설치하고 /etc/shells에 추가한 후 기본 쉘로 변경하세요.

💡 Docker를 사용한다면 베이스 이미지에 어떤 Bash가 포함되어 있는지 확인하세요. Alpine Linux는 경량화를 위해 Bash 대신 ash를 사용하므로, 필요하면 apk add bash로 설치해야 합니다.

💡 스크립트 첫 부분에 버전 체크를 넣으면 좋습니다. [[ "${BASH_VERSINFO:-0}" -lt 4 ]] && echo "Bash 4+ required" && exit 1 한 줄로 간단히 체크할 수 있습니다.

💡 여러 버전의 Bash를 테스트하려면 Docker를 활용하세요. docker run -it bash:4.4 같은 명령어로 특정 버전의 Bash 환경을 즉시 만들 수 있어서 호환성 테스트에 유용합니다.


4. 개발 환경 설정 (에디터, 터미널)

시작하며

여러분이 요리를 배울 때를 떠올려보세요. 아무리 좋은 레시피가 있어도 무딘 칼과 낡은 도마로는 요리하기 힘들겠죠?

프로그래밍도 마찬가지입니다. 좋은 도구를 선택하고 제대로 설정하는 것이 생산성을 몇 배로 높여줍니다.

특히 Bash 스크립트를 작성할 때는 문법 하이라이팅, 자동 완성, 에러 감지 같은 기능이 있으면 훨씬 편합니다. 메모장으로 코딩하는 것과 전문 IDE로 하는 건 하늘과 땅 차이니까요.

또한 터미널 설정도 중요합니다. 색상 테마, 폰트, 단축키 등을 자신에게 맞게 커스터마이징하면 작업이 즐거워집니다.

바로 이럴 때 필요한 것이 체계적인 개발 환경 설정입니다. 한 번 제대로 설정해두면 평생 편하게 쓸 수 있으니, 시간을 들여서라도 자신에게 맞는 환경을 만들어보세요.

개요

간단히 말해서, 개발 환경 설정은 "여러분의 작업 공간을 꾸미는 것"입니다. 목수가 작업대를 정리하고 공구를 배치하듯이, 개발자도 에디터와 터미널을 자신의 작업 스타일에 맞게 설정합니다.

좋은 개발 환경이 왜 중요한가 하면, 코딩 속도와 정확도가 크게 달라지기 때문입니다. 예를 들어, VS Code에서 ShellCheck 확장을 설치하면 스크립트를 저장할 때마다 자동으로 문법 오류와 잠재적 버그를 찾아줍니다.

실행해보기 전에 문제를 발견하니까 디버깅 시간이 엄청나게 줄어듭니다. 기존에는 기본 설정 그대로 사용했다면, 이제는 문법 강조, 자동 완성, 린팅 도구를 활용하세요.

처음에는 설정하는 데 1-2시간 걸리지만, 이후로 매일 몇 십 분씩 절약됩니다. 일주일만 지나도 투자한 시간을 완전히 회수합니다.

추천 도구를 소개하면, 에디터는 VS Code + Bash IDE 확장이 가장 인기 있고, 터미널은 iTerm2(macOS), Windows Terminal(Windows), Terminator(Linux)가 좋습니다. Oh My Zsh나 Starship 같은 쉘 테마 도구를 사용하면 프롬프트를 예쁘게 꾸미고, Git 상태나 Python 버전 같은 유용한 정보를 실시간으로 볼 수 있습니다.

코드 예제

#!/bin/bash
# 개발 환경 자동 설정 스크립트 예제

# VS Code에 유용한 Bash 확장 설치
echo "VS Code 확장 설치 중..."
code --install-extension timonwong.shellcheck
code --install-extension mads-hartmann.bash-ide-vscode
code --install-extension foxundermoon.shell-format

# .bashrc에 유용한 설정 추가
echo "Bash 설정 파일 업데이트 중..."
cat >> ~/.bashrc << 'EOF'

# 컬러풀한 ls 출력
alias ls='ls --color=auto'
alias ll='ls -alF'

# Git 브랜치를 프롬프트에 표시
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
export PS1="\u@\h \W \[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

# 히스토리 설정 개선
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoredups:erasedups

EOF

# 설정 즉시 적용
source ~/.bashrc

echo "개발 환경 설정 완료!"

설명

이것이 하는 일: 이 스크립트는 Bash 개발에 필요한 VS Code 확장을 자동으로 설치하고, 터미널 설정을 개선하는 작업을 한 번에 처리합니다. 신입 개발자 온보딩이나 새 컴퓨터 설정 시 유용한 자동화 패턴입니다.

첫 번째로, code --install-extension 명령어는 VS Code의 확장을 명령줄에서 설치하는 방법입니다. ShellCheck는 스크립트의 문법과 일반적인 실수를 체크해주는 최고의 도구이고, Bash IDE는 자동 완성과 함수 정의로 이동 같은 IDE 기능을 제공합니다.

Shell Format은 코드를 예쁘게 정렬해주는 포매터입니다. 그 다음으로, cat >> ~/.bashrc << 'EOF'는 "히어독(heredoc)"이라는 문법입니다.

여러 줄의 텍스트를 파일 끝에 추가하는 편리한 방법입니다. >>는 파일 끝에 추가(append)를 의미하고, <<는 여기서부터 EOF까지의 내용을 입력으로 사용하라는 뜻입니다.

'EOF'처럼 따옴표로 감싸면 변수가 확장되지 않고 그대로 들어갑니다. alias는 긴 명령어에 짧은 이름을 붙이는 기능입니다.

ll을 입력하면 ls -alF가 실행되어 모든 파일을 상세하게 보여줍니다. --color=auto는 파일 종류에 따라 색상을 다르게 표시해서 가독성을 높입니다.

디렉토리는 파란색, 실행 파일은 초록색 같은 식이죠. parse_git_branch 함수는 현재 디렉토리가 Git 저장소라면 브랜치 이름을 가져옵니다.

이것을 PS1 프롬프트에 넣으면 터미널에 항상 현재 브랜치가 표시됩니다. \u는 사용자명, \h는 호스트명, \W는 현재 디렉토리, \[\033[32m\]은 초록색 코드입니다.

마치 상태 표시줄처럼 유용한 정보를 한눈에 볼 수 있습니다. HISTSIZEHISTFILESIZE는 명령어 히스토리를 얼마나 많이 저장할지 결정합니다.

기본값은 500개인데, 10000개로 늘리면 예전에 썼던 명령어를 쉽게 찾을 수 있습니다. HISTCONTROL=ignoredups는 중복된 명령어를 히스토리에 저장하지 않아서 history 명령 결과가 깔끔해집니다.

여러분이 이 코드를 사용하면 10분 만에 프로 개발자 수준의 환경을 갖출 수 있습니다. 매일 사용하는 명령어를 alias로 만들어두고, 프롬프트에서 Git 정보를 확인하고, 편집기에서 실시간으로 에러를 체크하면서 코딩하는 경험은 정말 다릅니다.

한 번 설정해두면 새 컴퓨터에서도 이 스크립트를 실행하기만 하면 되니까 일관된 환경을 유지할 수 있습니다.

실전 팁

💡 .bashrc와 .bash_profile의 차이를 알아두세요. .bashrc는 새 터미널 창을 열 때마다 실행되고, .bash_profile은 로그인할 때만 실행됩니다. macOS는 .bash_profile을 사용하니 그 안에서 .bashrc를 source하는 패턴이 일반적입니다.

💡 ShellCheck를 반드시 사용하세요! 스크립트를 작성하면서 실시간으로 "이 변수는 따옴표로 감싸세요" 같은 조언을 받으면 실수가 크게 줄어듭니다. CLI에서는 shellcheck script.sh 명령으로 사용할 수 있습니다.

💡 터미널 폰트는 "Nerd Fonts"를 설치하세요. 아이콘과 특수 문자가 예쁘게 표시되어 Powerline이나 Starship 같은 테마가 제대로 보입니다. "FiraCode Nerd Font"나 "MesloLGS NF"가 인기 있습니다.

💡 dotfiles를 Git으로 관리하세요. .bashrc, .vimrc, .gitconfig 같은 설정 파일들을 GitHub에 올려두면 새 컴퓨터에서 git clone만 하면 모든 설정을 복원할 수 있습니다. 많은 개발자들이 공개 dotfiles 저장소를 운영하니 참고하면 좋습니다.

💡 VS Code의 작업 공간 설정을 활용하세요. 프로젝트마다 .vscode/settings.json을 만들어서 탭 크기, 포매터 규칙 등을 저장하면 팀원들과 일관된 코드 스타일을 유지할 수 있습니다.


5. PATH 환경변수 이해하기

시작하며

여러분이 친구에게 "책 좀 가져다줘"라고 부탁했는데, 친구가 "어디 있는데?"라고 묻는다면? 위치를 정확히 알려줘야 하겠죠.

컴퓨터도 똑같습니다. 여러분이 python이나 git 같은 명령어를 입력하면, 컴퓨터는 "그게 어디 있는데?"라고 궁금해합니다.

이 문제는 초보 개발자들이 가장 자주 겪는 어려움 중 하나입니다. "command not found" 에러를 본 적 있나요?

프로그램은 분명히 설치했는데 실행이 안 될 때, 99%는 PATH 설정 문제입니다. 프로그램 파일은 컴퓨터 어딘가에 있는데, 쉘이 그 위치를 모르는 거죠.

바로 이럴 때 필요한 것이 PATH 환경변수입니다. 쉘에게 "프로그램을 찾을 때 이 폴더들을 확인해봐"라고 알려주는 이정표 역할을 합니다.

이것만 제대로 이해하면 설치 관련 문제의 대부분을 해결할 수 있습니다.

개요

간단히 말해서, PATH는 "실행 파일을 찾는 검색 경로 목록"입니다. 여러분이 책을 찾을 때 "책상, 책장, 침대 위" 순서로 확인하듯이, 쉘도 PATH에 나열된 디렉토리들을 순서대로 확인합니다.

PATH가 왜 중요한가 하면, 명령어를 편리하게 사용할 수 있게 해주기 때문입니다. 만약 PATH가 없다면 python이라고 입력하는 대신 /usr/bin/python처럼 전체 경로를 매번 입력해야 합니다.

예를 들어, Node.js를 설치했는데 node 명령어가 안 된다면, Node.js 설치 경로가 PATH에 없는 겁니다. 기존에는 "프로그램 설치하면 자동으로 되는 거 아니야?"라고 생각했다면, 이제는 "PATH에 제대로 추가됐는지 확인"하는 습관을 들여야 합니다.

특히 수동으로 프로그램을 설치하거나, 여러 버전을 관리할 때는 PATH 설정이 필수입니다. PATH의 핵심 특징은 콜론(:)으로 구분된 디렉토리 목록이라는 점입니다.

/usr/local/bin:/usr/bin:/bin 같은 형태인데, 왼쪽부터 순서대로 검색합니다. 따라서 같은 이름의 프로그램이 여러 곳에 있으면 가장 먼저 발견된 것이 실행됩니다.

이것을 이해하면 Python 2와 Python 3처럼 여러 버전을 관리하는 것도 쉬워집니다.

코드 예제

#!/bin/bash
# PATH 환경변수 다루기 예제

# 현재 PATH 확인 (읽기 쉽게 줄바꿈해서 출력)
echo "=== 현재 PATH 목록 ==="
echo "$PATH" | tr ':' '\n'

# 특정 명령어가 어디 있는지 찾기
echo -e "\n=== python 위치 찾기 ==="
which python3
type python3

# 새로운 경로를 PATH 앞쪽에 추가 (우선순위 높음)
export PATH="/opt/my-tools/bin:$PATH"

# 새로운 경로를 PATH 뒤쪽에 추가 (우선순위 낮음)
export PATH="$PATH:/home/user/scripts"

# PATH 설정을 .bashrc에 영구적으로 추가
echo 'export PATH="/opt/my-tools/bin:$PATH"' >> ~/.bashrc

# 명령어가 PATH에 있는지 확인하는 함수
check_command() {
    if command -v "$1" &> /dev/null; then
        echo "$1: 사용 가능 (위치: $(which $1))"
    else
        echo "$1: 찾을 수 없음. PATH 확인 필요!"
    fi
}

check_command python3
check_command node
check_command docker

설명

이것이 하는 일: 이 스크립트는 PATH 환경변수를 조회하고, 수정하고, 검증하는 실무 패턴을 보여줍니다. 새 도구를 설치했을 때 PATH 설정이 제대로 됐는지 확인하는 데 사용할 수 있습니다.

첫 번째로, echo "$PATH" | tr ':' '\n' 부분은 PATH를 보기 좋게 출력합니다. tr(translate)는 문자를 변환하는 명령인데, 여기서는 콜론(:)을 줄바꿈 문자(\n)로 바꿉니다.

그러면 /usr/local/bin:/usr/bin이 두 줄로 나뉘어서 보여집니다. 파이프(|)는 앞 명령의 출력을 뒤 명령의 입력으로 연결하는 강력한 기능입니다.

그 다음으로, whichtype 명령어는 비슷하지만 약간 다릅니다. which는 PATH에서 실행 파일의 전체 경로만 보여주고, type은 alias, 함수, 내장 명령어까지 구분해서 알려줍니다.

type cd를 해보면 "cd is a shell builtin"이라고 나오는데, 이건 외부 프로그램이 아니라 쉘에 내장된 명령어라는 뜻입니다. export PATH="/opt/my-tools/bin:$PATH" 부분이 핵심입니다.

export는 환경변수를 설정하는 명령어입니다. 새 경로를 $PATH 앞에 붙이는 이유는 우선순위 때문입니다.

쉘은 왼쪽부터 검색하니까, /opt/my-tools/bin에 있는 프로그램이 다른 곳보다 먼저 발견됩니다. 반대로 뒤에 붙이면 낮은 우선순위가 됩니다.

.bashrc에 추가하는 부분은 매우 중요합니다. export 명령어는 현재 터미널 세션에서만 유효합니다.

터미널을 닫으면 사라지죠. .bashrc는 새 터미널을 열 때마다 자동으로 실행되는 스크립트 파일이니까, 여기에 PATH 설정을 넣으면 영구적으로 적용됩니다.

command -v 명령어는 프로그램이 존재하는지 확인하는 가장 안정적인 방법입니다. which보다 더 범용적이고, POSIX 표준이라서 모든 쉘에서 동작합니다.

&> /dev/null 부분은 출력과 에러를 모두 /dev/null(휴지통)로 버리는 뜻입니다. 결과를 보지 않고 성공/실패 여부만 판단하고 싶을 때 사용하는 패턴입니다.

여러분이 이 코드를 사용하면 "command not found" 에러와 영원히 작별할 수 있습니다. 새 도구를 설치할 때마다 PATH를 확인하고, 필요하면 추가하고, 제대로 작동하는지 검증하는 체계적인 방법을 갖추게 됩니다.

특히 Python 가상환경, Node.js nvm, Ruby rbenv처럼 버전 관리 도구를 사용할 때는 PATH 이해가 필수입니다.

실전 팁

💡 PATH를 수정할 때는 항상 $PATH를 포함시키세요. export PATH="/new/path"처럼 쓰면 기존 경로가 모두 사라져서 기본 명령어조차 못 쓰게 됩니다. 반드시 export PATH="/new/path:$PATH"처럼 기존 값을 유지하세요.

💡 보안 주의: 현재 디렉토리(.)를 PATH에 넣지 마세요. export PATH=".:$PATH" 같은 설정은 위험합니다. 악의적인 사람이 ls라는 이름의 악성 스크립트를 만들어두면, 여러분이 ls를 입력할 때 그게 실행될 수 있습니다.

💡 PATH가 너무 길어지지 않도록 관리하세요. 불필요한 경로가 많으면 명령어 검색 속도가 느려집니다. echo "$PATH" | tr ':' '\n' | nl로 번호를 붙여서 보고, 중복되거나 사용하지 않는 경로는 제거하세요.

💡 시스템 재부팅 후에도 PATH가 유지되는지 확인하세요. 특히 macOS에서는 .bash_profile과 .bashrc의 차이 때문에 헷갈릴 수 있습니다. 설정 후 새 터미널 창을 열어서 테스트해보는 습관을 들이세요.

💡 Docker 컨테이너나 CI/CD 파이프라인에서는 PATH 설정을 명시적으로 하세요. ENV PATH="/app/bin:$PATH" (Dockerfile) 또는 export PATH="..." (.gitlab-ci.yml)처럼 환경에 맞는 방법으로 설정해야 합니다.


6. 스크립트 실행 권한 설정

시작하며

여러분이 회사에 출근했는데 사무실 문이 잠겨있다면? 열쇠가 필요하겠죠.

컴퓨터 시스템도 마찬가지로 "권한"이라는 보안 시스템이 있습니다. 파일을 읽을 권한, 수정할 권한, 실행할 권한이 각각 따로 있어요.

이 문제는 Bash 스크립트를 처음 배우는 사람들이 100% 겪는 통과의례입니다. 스크립트를 열심히 작성하고 ./myscript.sh를 실행했는데 "Permission denied"라는 에러가 나오면 당황스럽죠.

파일은 분명히 있는데 왜 실행이 안 되는 걸까요? 바로 이럴 때 필요한 것이 실행 권한 설정입니다.

chmod 명령어로 파일에 "실행해도 된다"는 표시를 해줘야 쉘이 그 파일을 프로그램으로 인식합니다. 보안도 중요하지만, 작업도 제대로 할 수 있어야 하니까요.

개요

간단히 말해서, 파일 권한은 "누가 이 파일로 무엇을 할 수 있는지" 정하는 규칙입니다. 유닉스 계열 시스템(Linux, macOS)에서는 모든 파일에 소유자(owner), 그룹(group), 다른 사람들(others)에 대한 읽기(read), 쓰기(write), 실행(execute) 권한이 있습니다.

실행 권한이 왜 중요한가 하면, 보안과 직결되기 때문입니다. 만약 모든 파일이 기본적으로 실행 가능하다면, 악성 스크립트가 자동으로 실행될 위험이 있습니다.

예를 들어, 이메일 첨부파일로 받은 스크립트가 자동으로 실행된다면 끔찍하겠죠. 그래서 기본적으로는 실행이 차단되어 있고, 명시적으로 허용해야 합니다.

기존에는 "파일은 그냥 파일인데 왜 이렇게 복잡해?"라고 생각했다면, 이제는 "권한 설정으로 보안을 관리한다"고 이해하면 됩니다. Windows에서는 확장자(.exe)로 실행 파일을 구분하지만, 유닉스에서는 권한 비트로 판단합니다.

권한의 핵심 특징은 8진수 표기법입니다. chmod 755처럼 숫자로 표현하는데, 7은 읽기+쓰기+실행(4+2+1), 5는 읽기+실행(4+1)을 의미합니다.

또는 chmod +x처럼 기호로도 표현할 수 있습니다. +x는 "실행 권한 추가"라는 뜻이고, 가장 간단하고 많이 쓰는 방법입니다.

코드 예제

#!/bin/bash
# 파일 권한 관리 예제

# 현재 디렉토리의 파일 권한 확인
echo "=== 파일 권한 목록 ==="
ls -lh

# 스크립트에 실행 권한 부여 (가장 간단한 방법)
chmod +x myscript.sh

# 상세한 권한 설정 (소유자: 모든 권한, 그룹/기타: 읽기+실행)
chmod 755 deploy.sh

# 자신만 실행 가능하도록 설정 (보안이 중요한 스크립트)
chmod 700 secret-script.sh

# 현재 권한 확인하는 함수
check_permission() {
    if [ -x "$1" ]; then
        echo "$1: 실행 가능 ✓"
    else
        echo "$1: 실행 불가 - chmod +x $1 실행 필요"
    fi
}

# 스크립트 파일에 실행 권한이 없으면 자동으로 추가
setup_script() {
    local script="$1"
    if [ ! -x "$script" ]; then
        echo "$script에 실행 권한 추가 중..."
        chmod +x "$script"
        echo "완료! 이제 ./$script로 실행할 수 있습니다."
    fi
}

# 사용 예시
check_permission "test.sh"
setup_script "automation.sh"

설명

이것이 하는 일: 이 스크립트는 파일 권한을 확인하고 설정하는 실무 패턴을 보여줍니다. 특히 배포 자동화나 개발 환경 설정 스크립트에서 자주 사용하는 권한 관리 방법입니다.

첫 번째로, ls -lh 명령어는 파일의 상세 정보를 사람이 읽기 좋은 형태로 보여줍니다. -l은 long format(상세), -h는 human-readable(사람이 읽기 좋게)을 의미합니다.

출력의 첫 부분에 -rwxr-xr-x 같은 문자열이 나오는데, 첫 문자는 파일 타입(- 파일, d 디렉토리), 그 다음 9개 문자는 권한을 나타냅니다. rwx / r-x / r-x 세 그룹으로 나뉘어 소유자/그룹/기타 사용자의 권한을 표시합니다.

그 다음으로, chmod +x는 실행 권한을 추가하는 가장 간단한 방법입니다. 이미 있던 권한은 유지하고 실행 권한만 추가합니다.

모든 사용자(소유자, 그룹, 기타)에게 실행 권한이 부여됩니다. 스크립트를 작성한 후 가장 먼저 하는 작업이 바로 이것입니다.

chmod 755는 숫자로 권한을 정확히 지정하는 방법입니다. 첫 번째 7은 소유자에게 읽기(4)+쓰기(2)+실행(1)=7, 두 번째 5는 그룹에게 읽기(4)+실행(1)=5, 세 번째 5는 다른 사용자에게도 읽기+실행을 의미합니다.

배포 스크립트처럼 여러 사람이 실행해야 하는 경우에 사용합니다. chmod 700은 오직 소유자만 모든 권한을 가지고, 다른 사람은 아무것도 할 수 없게 만듭니다.

비밀번호나 API 키를 다루는 스크립트처럼 보안이 중요한 경우 사용합니다. 700은 소유자만 rwx, 그룹과 기타는 0(권한 없음)입니다.

[ -x "$1" ]은 파일이 실행 가능한지 테스트하는 조건식입니다. -x는 "executable(실행 가능)" 테스트 연산자입니다.

다른 유용한 연산자로는 -f(일반 파일 존재), -d(디렉토리 존재), -r(읽기 가능), -w(쓰기 가능) 등이 있습니다. 이것들을 조합하면 파일 상태를 정밀하게 확인할 수 있습니다.

setup_script 함수는 실무에서 정말 유용한 패턴입니다. 스크립트를 Git에서 받아오면 실행 권한이 없는 경우가 많은데, 이 함수를 실행하면 자동으로 권한을 추가해줍니다.

local 키워드는 변수를 함수 안에서만 유효하게 만들어서 전역 변수 오염을 방지합니다. 여러분이 이 코드를 사용하면 권한 관련 에러에서 해방됩니다.

스크립트를 작성하자마자 실행 권한을 부여하는 습관을 들이고, 보안이 중요한 파일은 700으로 설정하고, 팀원과 공유하는 도구는 755로 설정하는 체계적인 권한 관리가 가능해집니다. 또한 배포 스크립트에서 권한 확인 로직을 넣으면 "실행이 안 돼요"라는 문의를 미리 방지할 수 있습니다.

실전 팁

💡 Git에서 실행 권한을 유지하려면 git add --chmod=+x script.sh를 사용하세요. 또는 git update-index --chmod=+x script.sh로도 가능합니다. 이렇게 하면 다른 사람이 클론해도 실행 권한이 그대로 유지됩니다.

💡 절대 777 권한은 사용하지 마세요! chmod 777은 모든 사용자에게 모든 권한을 주는 것으로, 심각한 보안 위험입니다. "권한 에러가 나니까 일단 777로..." 하는 순간 해킹 당할 수 있습니다. 정확히 필요한 권한만 부여하세요.

💡 디렉토리의 실행 권한은 "접근 권한"을 의미합니다. chmod +x mydir을 하면 그 디렉토리 안으로 cd할 수 있게 됩니다. 디렉토리 안의 파일 목록을 보려면 읽기 권한(r)도 필요하니 보통 chmod 755를 사용합니다.

💡 umask를 설정하면 새로 만드는 파일의 기본 권한을 조정할 수 있습니다. umask 022는 새 파일이 644(rw-r--r--) 권한을 갖게 합니다. .bashrc에 넣어두면 일관된 권한 정책을 유지할 수 있습니다.

💡 서버에서는 최소 권한 원칙을 지키세요. 웹 서버가 실행하는 스크립트는 www-data 같은 전용 계정으로 실행하고, 꼭 필요한 파일만 접근 가능하도록 권한을 제한하세요. chown으로 소유자를 변경하고 chmod로 권한을 좁히는 것이 보안의 기본입니다.


#Bash#Shell#Linux#Script#Environment#Linux,Bash,Shell

댓글 (0)

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