Bash와 셸 실행
배시 · Bourne Again Shell
Bash는 명령 문자열을 해석하여 프로그램·내장 명령··파이프를 실행하는 셸이다. 터미널은 입출력 창이고 셸은 그 안의 명령 해석기이므로 변수 확장과 인수 경계가 실제 프로그램 실행 전에 결정된다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 문자열을 인수로 해석하고 실행할 명령을 선택한다.
- 표준 입력·출력·오류와 파이프·파일 연결을 구성한다.
- 조건·반복·함수와 종료 상태로 여러 작업의 흐름을 만든다.
02어떤 순서로 동작하나
- 구문 읽기
입력 명령에서 따옴표·연산자·치환 등의 구문을 구분한다.
- 확장·인수 구성
변수 확장과 필요한 ·경로명 확장 등을 적용하여 프로그램에 넘길 인수를 정한다.
- 입출력 연결·실행
을 순서대로 적용하고 내장 명령 또는 외부 프로그램을 실행한다.
- 종료 상태 처리
프로그램과 파이프의 종료 상태를 받아 조건 분기·후속 작업을 결정한다. 출력 내용과 종료 상태는 별개다.
03먼저 알아둘 용어와 구성요소
- 는 내부 문자를 그대로 보존하고, 큰따옴표는 변수·명령 치환을 허용하면서 확장된 값이 공백으로 다시 나뉘거나 파일 이름 패턴으로 확장되는 것을 막는 데 사용한다.
- 인용 없는 변수 확장은 와 경로명 확장의 영향을 받을 수 있으므로 파일 경로 같은 하나의 값을 전달할 때는 보통 큰따옴표로 감싼다.
- 로 표시한 변수는 이후 실행하는 자식 의 환경에 포함된다.
- 는 명령 이름에 슬래시가 없을 때 실행 파일을 찾는 디렉터리 목록이며 앞에서부터 검색한다.
- >는 기본적으로 출력 파일을 새로 만들거나 기존 내용을 비우고, >>는 끝에 추가하며, <는 파일을 입력으로 연결한다.
- 버퍼의 남은 자료를 다 읽고 모든 쓰기 끝 참조가 닫혀야 읽기가 EOF를 볼 수 있다. 다른 자식이 불필요한 쓰기 FD를 잡고 있으면 생산자가 끝나도 소비자가 기다릴 수 있다.
PATH 설정을 쓸 때와 source할 때의 변수 확장 비교하기
따옴표와 실행 시점이 설정 파일에 저장되는 문자열 및 현재 셸 환경을 어떻게 바꾸는지 추적한다.
실습 구성과 전제
- 두 사진은 Miniconda 실행 경로를 셸 설정에 넣는 서로 다른 방법의 사례다. 운영용 /etc/bashrc를 그대로 수정하지 않고 새 실습 디렉터리의 파일로 재구성한다.
- Bash의 큰따옴표와 를 비교한다. 실제 Miniconda 설치 경로는 환경마다 다르며 추가가 환경 활성화와 같은 작업은 아니다.
큰따옴표 안의 변수는 설정을 쓰는 순간 확장된다
- 첫 사진은 echo의 큰따옴표 안에서 $를 사용하고 결과를 파일에 추가한다. 현재 셸이 변수 값을 먼저 넣으므로 저장되는 문자열에는 그 시점의 값이 포함된다.
- 이 방식은 다른 계정·세션에서도 재평가할 식을 남기려는 의도와 다를 수 있다. 사진의 성공 여부와 별개로 파일에 실제 어떤 문자열이 쓰였는지 읽어야 한다.
원본 크기로 보기 ↗- echo 명령의 export PATH 표현이 큰따옴표로 감싸져 있다.
- 출력은 >>로 /etc/bashrc에 추가되며 Miniconda의 bin 경로가 포함되어 있다.
확인 기준파일에 $라는 글자가 남았는지 이미 긴 경로 목록으로 바뀌었는지 구분한다. 따옴표 종류가 단순한 꾸밈이 아니다.
작은따옴표로 식을 보존하고 실행 시점을 늦춘다
- 두 번째 사진의 안에서는 셸이 $를 즉시 치환하지 않는다. sed가 추가한 설정 행을 나중에 셸이 읽을 때 변수 확장이 일어난다.
- 재구성 예시는 새 파일에 식을 저장한 뒤 cat으로 확인한다. printf에 전달한 는 제거되지만 그 안의 $HOME·$ 문자열은 파일에 그대로 남는다.
bashprintf '%s\n' 'export PATH="$HOME/miniconda3/bin:$PATH"' > ./lab-env.sh cat ./lab-env.sh새 빈 실습 디렉터리에서만 사용할 파일 작성 예시다. 시스템 설정 파일을 변경하지 않는다.
원본 크기로 보기 ↗- sed에 전달하는 추가 스크립트가 작은따옴표로 묶여 있고 $PATH가 포함되어 있다.
- 그 뒤 source, PATH 조회, conda 관련 명령이 이어져 파일 작성과 환경 적용이 별도 단계임을 보여 준다.
확인 기준설정 파일 내용에 변수를 남기는 것과 현재 셸에서 그 변수를 확장하는 것은 다른 시점의 작업이다.
source의 영향 범위를 자식 셸로 제한해 확인한다
- source는 현재 셸 안에서 파일의 문장을 실행한다. 반면 별도로 실행한 bash 의 환경 변경은 부모 셸로 거슬러 올라가지 않는다.
- 아래 예시는 자식 Bash에서만 파일을 source한 뒤 경로와 명령 위치를 확인한다. 명령 발견이나 버전 출력은 환경이 활성화되었다는 증거와는 다르다.
bashbash -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상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.