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 파이프라인 문서는 파이프 연결과 종료 상태를 설명합니다.









