개념 사전 · 프로그램

Bash와 셸 실행

배시 · Bourne Again Shell

Bash는 명령 문자열을 해석하여 프로그램·내장 명령··파이프를 실행하는 셸이다. 터미널은 입출력 창이고 셸은 그 안의 명령 해석기이므로 변수 확장과 인수 경계가 실제 프로그램 실행 전에 결정된다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 문자열을 인수로 해석하고 실행할 명령을 선택한다.
  • 표준 입력·출력·오류와 파이프·파일 연결을 구성한다.
  • 조건·반복·함수와 종료 상태로 여러 작업의 흐름을 만든다.

02어떤 순서로 동작하나

  1. 구문 읽기

    입력 명령에서 따옴표·연산자·치환 등의 구문을 구분한다.

  2. 확장·인수 구성

    변수 확장과 필요한 ·경로명 확장 등을 적용하여 프로그램에 넘길 인수를 정한다.

  3. 입출력 연결·실행

    을 순서대로 적용하고 내장 명령 또는 외부 프로그램을 실행한다.

  4. 종료 상태 처리

    프로그램과 파이프의 종료 상태를 받아 조건 분기·후속 작업을 결정한다. 출력 내용과 종료 상태는 별개다.

03먼저 알아둘 용어와 구성요소

는 내부 문자를 그대로 보존하고, 큰따옴표는 변수·명령 치환을 허용하면서 확장된 값이 공백으로 다시 나뉘거나 파일 이름 패턴으로 확장되는 것을 막는 데 사용한다.
인용 없는 변수 확장은 와 경로명 확장의 영향을 받을 수 있으므로 파일 경로 같은 하나의 값을 전달할 때는 보통 큰따옴표로 감싼다.
로 표시한 변수는 이후 실행하는 자식 의 환경에 포함된다.
는 명령 이름에 슬래시가 없을 때 실행 파일을 찾는 디렉터리 목록이며 앞에서부터 검색한다.
>는 기본적으로 출력 파일을 새로 만들거나 기존 내용을 비우고, >>는 끝에 추가하며, <는 파일을 입력으로 연결한다.
버퍼의 남은 자료를 다 읽고 모든 쓰기 끝 참조가 닫혀야 읽기가 EOF를 볼 수 있다. 다른 자식이 불필요한 쓰기 FD를 잡고 있으면 생산자가 끝나도 소비자가 기다릴 수 있다.
LEARN THROUGH PRACTICE

PATH 설정을 쓸 때와 source할 때의 변수 확장 비교하기

따옴표와 실행 시점이 설정 파일에 저장되는 문자열 및 현재 셸 환경을 어떻게 바꾸는지 추적한다.

실습 구성과 전제

  • 두 사진은 Miniconda 실행 경로를 셸 설정에 넣는 서로 다른 방법의 사례다. 운영용 /etc/bashrc를 그대로 수정하지 않고 새 실습 디렉터리의 파일로 재구성한다.
  • Bash의 큰따옴표와 를 비교한다. 실제 Miniconda 설치 경로는 환경마다 다르며 추가가 환경 활성화와 같은 작업은 아니다.
  1. 큰따옴표 안의 변수는 설정을 쓰는 순간 확장된다

    • 첫 사진은 echo의 큰따옴표 안에서 $를 사용하고 결과를 파일에 추가한다. 현재 셸이 변수 값을 먼저 넣으므로 저장되는 문자열에는 그 시점의 값이 포함된다.
    • 이 방식은 다른 계정·세션에서도 재평가할 식을 남기려는 의도와 다를 수 있다. 사진의 성공 여부와 별개로 파일에 실제 어떤 문자열이 쓰였는지 읽어야 한다.
    Linux 초기 실행 환경 설정 · RL 세팅 자동화원본 크기로 보기 ↗
    • echo 명령의 export PATH 표현이 큰따옴표로 감싸져 있다.
    • 출력은 >>로 /etc/bashrc에 추가되며 Miniconda의 bin 경로가 포함되어 있다.
    확인 기준

    파일에 $라는 글자가 남았는지 이미 긴 경로 목록으로 바뀌었는지 구분한다. 따옴표 종류가 단순한 꾸밈이 아니다.

  2. 작은따옴표로 식을 보존하고 실행 시점을 늦춘다

    • 두 번째 사진의 안에서는 셸이 $를 즉시 치환하지 않는다. sed가 추가한 설정 행을 나중에 셸이 읽을 때 변수 확장이 일어난다.
    • 재구성 예시는 새 파일에 식을 저장한 뒤 cat으로 확인한다. printf에 전달한 는 제거되지만 그 안의 $HOME·$ 문자열은 파일에 그대로 남는다.
    bash
    printf '%s\n' 'export PATH="$HOME/miniconda3/bin:$PATH"' > ./lab-env.sh
    cat ./lab-env.sh

    새 빈 실습 디렉터리에서만 사용할 파일 작성 예시다. 시스템 설정 파일을 변경하지 않는다.

    팀 · 실습·개념 참고 화면 4원본 크기로 보기 ↗
    • sed에 전달하는 추가 스크립트가 작은따옴표로 묶여 있고 $PATH가 포함되어 있다.
    • 그 뒤 source, PATH 조회, conda 관련 명령이 이어져 파일 작성과 환경 적용이 별도 단계임을 보여 준다.
    확인 기준

    설정 파일 내용에 변수를 남기는 것과 현재 셸에서 그 변수를 확장하는 것은 다른 시점의 작업이다.

  3. source의 영향 범위를 자식 셸로 제한해 확인한다

    • source는 현재 셸 안에서 파일의 문장을 실행한다. 반면 별도로 실행한 bash 의 환경 변경은 부모 셸로 거슬러 올라가지 않는다.
    • 아래 예시는 자식 Bash에서만 파일을 source한 뒤 경로와 명령 위치를 확인한다. 명령 발견이나 버전 출력은 환경이 활성화되었다는 증거와는 다르다.
    bash
    bash -c 'source ./lab-env.sh; printf "%s\n" "$PATH"; command -v conda; command -v python'
    command -v python

    첫 행의 환경 변경은 자식 Bash에만 적용된다. 다음 행은 원래 셸의 명령 탐색 결과다.

    확인 기준

    명령 위치가 기대한 설치 경로인지 확인한다. 에서 찾은 실행 파일과 의 활성 환경· sys.executable을 혼동하지 않는다.

실습에서 확인한 동작 원리

  • 따옴표는 변수 확장 여부를 정하고, 파일 작성과 source는 서로 다른 확장 시점을 만든다.
  • 환경은 부모에서 자식으로 전달되며 자식에서 바꾼 가 부모 셸을 자동 변경하지 않는다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서

04예제로 따라가기

  • 공백이 있는 경로를 따옴표로 묶지 않으면 여러 인자로 나뉘어 프로그램이 예상한 한 파일 이름을 받지 못할 수 있다.
  • cmd >out 2>&1은 두 출력을 같은 파일로 보내지만 cmd 2>&1 >out은 stderr가 이전 stdout 대상을 계속 참조할 수 있어 순서가 중요하다.
  • 가상 파이프의 종료값이 1·0·0이면 기본 결과는 마지막 0이다. pipefail은 오류 판단을 바꾸지만 출력 자료 자체를 수정하지 않는다.

05혼동하기 쉬운 점과 확인 기준

  • Bash의 일반적인 파이프 구성에서는 각 명령이 서브셸 환경에서 실행되어 while read 안의 변수 변경이 바깥에 남지 않을 수 있다. lastpipe 같은 예외 설정을 포함해 실행 문맥을 확인한다.
  • 실패 명령 다음에 echo나 logger를 실행하고 $?를 읽으면 그 후속 명령의 상태를 읽게 된다. 원래 상태가 필요한 분기에서 즉시 보존한다.
  • 생산자의 종료 시각만 보지 않고 파이프 쓰기 끝을 상속한 다른 자식이 남았는지 확인한다. EOF를 보내는 별도 문자가 있다고 생각하면 FD 수명 문제를 놓친다.

06상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.