STDOUT과 STDIN을 연결하면 무엇을 의미합니까?


10

나는 책을 읽고 있습니다.

모든 프로세스에는 최소 3 개의 통신 채널, 즉 "표준 입력"(STDIN), "표준 출력"(STDOUT) 및 "표준 오류"(STDERR)가 있습니다.

대부분의 명령은 STDIN의 입력을 승인하고 출력을 STDOUT에 씁니다. STDERR에 오류 메시지를 씁니다. 이 규칙을 사용하면 빌딩 블록처럼 명령을 함께 묶어 복합 파이프 라인을 만들 수 있습니다.

쉘은 기호 <, >>>명령의 입력 또는 출력을 파일로 또는 파일로부터 경로를 재 지정하기위한 지시 사항으로 해석 합니다.

한 명령의 STDOUT을 다른 명령의 STDIN에 연결하려면 | 일반적으로 파이프라고 하는 기호를 사용하십시오 .

ps -ef | grep httpd

기본적으로 표준 입력은 사용자가 파일에 쓸 수있는 명령이고 표준 출력은 bash 쉘이 출력을 쉘에 출력하는 명령이며 표준 오류는 출력과 비슷하지만 파일 시스템에 오류가있을 때 호출됩니다. 그런 다음 STDOUT과 STDIN을 연결하는 부분에 도달하면 길을 잃습니다.

답변:


25

표준 입력 및 표준 출력은 명령이 아닙니다.

조립 라인이있는 공장에서 명령을 기계라고 상상해보십시오. 대부분의 기계는 데이터를 공급하기 위해 하나의 컨베이어 벨트와 데이터를 공급하기 위해 하나의 컨베이어 벨트를 갖도록 설계되었습니다. 그것들은 각각 표준 입력과 표준 출력입니다. 표준 오류는 기계 측면에서 리 젝트를 배출 할 수있는 개구부입니다.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

위의 다이어그램은 두 대의 기계를 통과하는 컨베이어 벨트를 보여줍니다. 데이터는 왼쪽의 입력 저장소에서 가져오고 기계 A로 공급 된 다음 출력이 기계 B로 더 전달되고 (입력 된 기계 B) 기계 B의 출력이 오른쪽의 출력 버킷에 저장됩니다.

유닉스 용어로 이것을 파이프 라인 이라고합니다 . 파이프는 머신 A를 머신 B에 연결하는 것입니다. 위의 파이프 라인에 대한 쉘 구문은 다음과 같습니다.

<input-file.txt commandA | commandB >output-file.txt

< 리디렉션 기호 연결 쉘을 알려줍니다 commandA파일에의 표준 입력을 input-file.txt시작하기 전에 commandA. 명령 이름 앞뒤에 리디렉션을 넣을 수 있습니다. >리디렉션 기호는 쉘에 commandB표준 출력을 연결하도록 지시합니다 output-file.txt. |가운데 의 파이프 ( " ") 기호는 쉘이 시작하기 전에 commandA표준 출력을 commandB표준 입력 에 연결하도록 지시 합니다.

명령은 하나 이상의 입력과 하나 이상의 출력을 가질 수 있지만 다른 날에는 중요합니다 .


3
시각 효과는 많은 도움이되었습니다
JohnMerlino

좋은 비유입니다. 나는 수년 동안 스트림 파이프 라인의 개념을 이해했지만 어쨌든 공장 / 컨베이어 유추를 사용한 사람은 아무도 없으므로 실제로 쉽게 간결하게 이해할 수 있습니다. 감사합니다!
Owen Blacker

1
훌륭한 비유. 마음에 들지 않으면 이것을 빌리려고합니다.
Tivie

Gilles, 나는 당신의 구절에 대해 질문했습니다 : unix.stackexchange.com/q/96724/29146 . 당신은 명확히 할 수 있습니까?
strugee

@Gilles-명령 전후에 리디렉션을 정의하는 옵션을 보여주는 예제를 포함 할 수 있습니까? 예를 들어 파이프 라인을 input-file.txt> commandA 또는 input-file.txt <commandA로 읽을 수 있습니까?
동기 부여

6

standard input is a command that allows user to write to a file

명령이 아니라 스트림입니다. 표준 입 / 출력은 우편함과 같습니다. 프로그램이 시작되면 수신 상자와 메일 발송 상자가 제공됩니다. 일반적으로 입력은 키보드에서 가져 오며받은 편지함에 넣어지고, 보낸 편지함에 넣은 메일은 터미널 화면에 나타납니다.

standard output is a command that has the bash shell write output to the shell

프로그램은 실제로 표준 출력 지점을 알지 못합니다. (와 같이 $ A | B) A를 B로 파이프 하면 A가 메일을 보낼 편지함에 넣을 때 B의받은 편지함에 들어갑니다. B는 입력을 처리하고 자신의 메일을 보낼 편지함에 넣습니다. 이것이 터미널에 표시됩니다.

언급 한 바와 같이 메타 포어를 제거하기 위해 표준 입력 / 출력은 스트림입니다. 메일 박스 또는 파일 디스크립터 는 스트림의 한쪽 끝입니다. 파이프는 A의 표준을 B의 표준에 연결하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.