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 / 명령어 / umask - 새 파일·디렉터리 기본 권한 제한

Linux / 명령어 / umask - 새 파일·디렉터리 기본 권한 제한

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

Linux 강좌 / 리눅스란 무엇인가? 커널, 배포판, 오픈 소스 이해하기

Linux 강좌 / 리눅스란 무엇인가? 커널, 배포판, 오픈 소스 이해하기

리눅스 커널과 배포판은 어떻게 다를까요? 사용자 공간과 오픈 소스의 의미를 구분하고, 현재 시스템의 커널·배포판 정보를 확인하는 방법을 알아봅니다.

Linux / 명령어 / rmdir - 빈 디렉터리 삭제

Linux / 명령어 / rmdir - 빈 디렉터리 삭제

Linux rmdir 명령어로 빈 디렉터리와 비어 있는 상위 경로를 안전하게 삭제하는 방법을 설명합니다. rm -r과의 차이, 실패 원인과 스크립트 사용법도 알아봅니다.

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux install 명령어로 파일을 복사하면서 권한, 소유자와 대상 디렉터리를 설정하는 방법을 설명합니다. cp와의 차이와 배포 스크립트에서의 활용법도 알아봅니다.

Linux / 명령어 / pkill - 이름으로 프로세스에 시그널 보내기

Linux / 명령어 / pkill - 이름으로 프로세스에 시그널 보내기

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

Linux / 명령어 / top - 프로세스 자원 사용량 실시간 확인

Linux / 명령어 / top - 프로세스 자원 사용량 실시간 확인

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

Linux / 명령어 / touch - 파일 생성과 타임스탬프 변경

Linux / 명령어 / touch - 파일 생성과 타임스탬프 변경

Linux touch 명령어로 빈 파일을 만들고 접근 시각과 수정 시각을 변경하는 방법을 설명합니다. 기준 파일의 시간을 복사하는 방법과 스크립트에서 사용할 때의 주의점도 알아봅니다.

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

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

Linux / 명령어 / zypper - openSUSE·SUSE에서 패키지와 저장소 관리

Linux / 명령어 / zypper - openSUSE·SUSE에서 패키지와 저장소 관리

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

Linux / 명령어 / date - 현재 시각 표시와 출력 형식 지정

Linux / 명령어 / date - 현재 시각 표시와 출력 형식 지정

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