Linux 강좌 / 표준 입력·출력, 리디렉션과 파이프 이해하기

셸 명령에는 보통 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr)라는 세 통로가 있습니다. Bash에서 <는 파일을 입력으로, >와 >>는 정상 출력을 파일로, 2>는 오류를 파일로 보냅니다. |는 한 명령의 출력을 다음 명령의 입력에 연결합니다. 어느 통로가 어디로 향하는지 알면 결과가 화면에 안 보이는 이유도 설명할 수 있습니다.

세 표준 스트림 구분하기

셸에서 프로세스가 처음 사용할 수 있는 세 표준 파일 디스크립터는 번호로도 표현합니다. 키보드·화면과 연결되는 것이 일반적이지만 리디렉션이나 파이프에 따라 다른 곳으로 바뀔 수 있습니다.

번호 이름 주요 역할
0 표준 입력(stdin) 명령이 읽는 데이터
1 표준 출력(stdout) 정상 결과
2 표준 오류(stderr) 진단·오류 메시지

두 출력은 터미널에 함께 보이더라도 서로 다른 통로입니다. 그래서 >로 정상 결과만 저장하면 오류 메시지는 여전히 화면에 남을 수 있습니다. 번호는 명령줄에 붙는 2> 같은 표기를 이해할 때 중요합니다.

실습용 파일 만들기

이 강좌의 예시는 Bash를 기준으로 합니다. 홈 디렉터리의 linux-course-14-practice가 이미 있다면 다른 이름을 고르세요. 새 디렉터리를 만들지 못했다면 다음 명령을 실행하지 마세요. >는 파일이 존재하면 내용을 비우고 새로 씁니다.

mkdir ~/linux-course-14-practice
cd ~/linux-course-14-practice
pwd

위치를 확인한 뒤 두 줄을 저장하고, >>로 한 줄을 덧붙입니다. >>는 파일 끝에 추가하는 방식입니다.

printf 'alpha\nbeta\n' > source.txt
printf 'gamma\n' >> source.txt
cat source.txt

마지막 출력은 차례로 alpha, beta, gamma입니다. 화면에 출력된 문자열을 파일에 보관할지, 기존 파일 뒤에 붙일지를 먼저 정한 다음 연산자를 선택하세요.

파일을 입력으로 주거나 정상 결과 저장하기

<는 파일을 표준 입력에 연결합니다. wc -l < source.txt는 파일 이름 인수를 넘기는 대신 입력 스트림을 제공하므로 숫자 3만 출력합니다. 반면 wc -l source.txt는 보통 숫자 뒤에 파일 이름도 표시합니다.

wc -l < source.txt

정상 출력을 별도 파일에 저장하려면 >를 사용합니다. 다음 명령 뒤에 화면에는 일치한 줄이 나타나지 않고 matches.txt에 beta가 저장됩니다.

grep 'beta' source.txt > matches.txt
cat matches.txt

cat matches.txt가 beta를 출력하는지 확인하세요. 리디렉션 대상 파일은 명령이 본격적으로 실행되기 전에 열리므로, 중요한 기존 파일에 >를 잘못 쓰면 원래 내용을 잃을 수 있습니다.

오류 통로를 따로 다루기

존재하지 않는 파일을 조회하면 ls는 진단 메시지를 표준 오류로 보냅니다. 다음 명령은 오류만 errors.txt에 저장합니다. 새 실습 폴더에서 absent-14.txt가 없는 상태를 전제로 합니다.

ls absent-14.txt 2> errors.txt
cat errors.txt

오류 문구는 로캘에 따라 달라지지만 파일이 없다는 내용이 보여야 합니다. 정상 출력과 오류를 한 파일로 합치려면 Bash에서 명령 > all.txt 2>&1처럼 씁니다. 2>&1은 표준 오류가 현재 표준 출력의 목적지를 가리키도록 합니다.

ls absent-14.txt > all.txt 2>&1
cat all.txt

리디렉션은 왼쪽에서 오른쪽으로 처리되므로 2>&1 > all.txt로 순서를 뒤집으면 같은 결과가 아닙니다. 뒤집은 경우 오류는 기존의 표준 출력 목적지인 화면으로 남을 수 있습니다.

파이프로 두 명령 연결하기

파이프 |는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력으로 보냅니다. 다음 예제는 beta가 포함된 줄을 찾고 그 줄 수를 셉니다.

grep 'beta' source.txt | wc -l

실습 파일에서는 1이 나옵니다. 파이프는 기본적으로 왼쪽의 표준 오류까지 보내지는 않습니다. 또한 Bash의 기본 파이프라인 종료 상태는 마지막 명령의 상태이므로, grep에서 일치 항목이 없어도 wc -l이 정상적으로 0을 출력하면 전체 상태가 성공일 수 있습니다. 여러 단계의 실패 여부가 중요하다면 Bash의 pipefail 설정 등 별도 확인 방법을 고려해야 합니다.

리디렉션은 파일과 명령의 통로를 바꾸고, 파이프는 명령과 명령을 연결합니다. 결과가 예상과 다를 때는 각 명령을 단독으로 실행해 정상 출력과 오류 중 어디에서 값이 나오는지 먼저 확인하세요.

공식 문서

GNU Bash 리디렉션 문서는 <·>·2>와 처리 순서를, GNU Bash 파이프라인 문서는 파이프 연결과 종료 상태를 설명합니다.

같은 카테고리의 다른 글
Linux / 명령어 / modinfo - 커널 모듈의 설명과 매개변수 확인

Linux / 명령어 / modinfo - 커널 모듈의 설명과 매개변수 확인

Linux modinfo 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / apt-get - APT 패키지 작업을 스크립트와 명령행에서 실행

Linux / 명령어 / apt-get - APT 패키지 작업을 스크립트와 명령행에서 실행

Linux apt-get 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / machine-id 확인 방법과 시스템 복제 시 주의사항

Linux / machine-id 확인 방법과 시스템 복제 시 주의사항

machine-id의 역할과 확인 방법, 복제용 이미지에서 파일을 삭제·비우거나 uninitialized로 설정할 때의 차이를 설명합니다. 운영 중인 서버의 ID 중복을 안전하게 처리하기 위한 점검 사항도 다룹니다.

Linux / 명령어 / printf - 지정한 형식으로 값 출력

Linux / 명령어 / printf - 지정한 형식으로 값 출력

Linux printf 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux dd 명령어로 파일과 블록 장치 데이터를 복사하고 변환하는 방법을 설명합니다. if와 of, 블록 크기, 진행률, 디스크 이미지 생성·복원 및 대상 장치 오지정 위험을 정리합니다.

Linux / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux stat 명령어로 파일 크기, 권한, 소유자, inode와 타임스탬프를 확인하는 방법을 설명합니다. atime·mtime·ctime·Birth의 차이와 출력 형식, 파일 시스템 조회법도 정리합니다.

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

Linux lsmod 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

Linux rsync 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / nmap - 허가된 호스트의 포트와 서비스 조사

Linux / 명령어 / nmap - 허가된 호스트의 포트와 서비스 조사

Linux nmap 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / bunzip2 - bzip2 압축 파일 풀기

Linux / 명령어 / bunzip2 - bzip2 압축 파일 풀기

Linux bunzip2 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.