파이핑은 명령을 병렬로 실행합니까?

파이핑은 명령을 병렬로 실행합니까?

저는 파이핑과 리디렉션을 더 깊이 이해하려고 노력하고 있습니다. 모든 가이드에는 cmd1 | cmd2cmd1이 실행되고 stdout이 cmd2의 stdin과 공유된다고 나와 있습니다 . 그러나 그것은 내 머리 속에 잘 들어맞지 않아서 테스트해 보았습니다.

그래서 그것은 둘 다 ./test.sh처럼 보입니다.그리고grep이 실행 중입니다.평행한!

소스 코드는 다음과 같습니다.

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

다른 칭찬으로 시도해 보면 비슷한 결과가 나타납니다. 파이프가 병렬로 작동합니까?

파이프와 리디렉션이 "내부적으로" 어떻게 작동하나요?

답변1

예, 모든 명령이 동시에 실행됩니다. 귀하의 경우 는 grep와 동시에 시작되지만 test.sh표준 입력을 읽기 때문에 test.sh무언가를 넣을 때까지 차단되며 한 번에 발생하지 않습니다. 두 프로세스는 서로 속도를 조절합니다. 두 번째 프로세스가 느리면 첫 번째 프로세스가 표준 출력 버퍼를 채우고 두 번째 프로세스가 일부를 읽을 때까지 기다리게 됩니다. 첫 번째가 느린 경우 사용 가능한 입력이 없으면 두 번째는 입력을 읽는 동안 차단됩니다.

실제로 첫 번째 프로세스의 stdout은 다소 큰 청크(약 4K)(*)로 작성되므로 첫 번째 프로세스가 최소한 4K 상당의 데이터를 쓸 때까지 두 번째 프로세스는 읽을 것이 없습니다. test.sh사용 방법 은 echo약간 다를 수 있으며 라인 버퍼 출력을 수행할 수 있습니다.

(*) 출력이 "tty"(즉, 터미널)에 대한 경우 라인 버퍼링된다는 규칙이 있습니다. 출력의 LF는 실제 출력이 발생하도록 합니다. 그렇지 않으면 4K 청크로 버퍼링됩니다. 첫 번째 프로세스는 모든 버퍼링을 명시적으로 억제할 수도 있지만 이는 성능에 좋지 않습니다.

답변2

당신은 실제로 , 및/또는 (재)방향이라는 것을 flow control다시 보고 계십니다. flow control, 또는 stdin, stdout(표준 입력/표준 출력).

위의 설명이 귀하가 내용을 더 잘 이해하는 데 도움이 되기를 바랍니다.예정된발생할 수 있으며 더 나은 방법은 무엇입니까?예상하다.

파이프, 또는 "파이핑" stdout, 단지감독하다 stdout대부분의 경우에.

병렬은정말~의 다른 이름협력 관계. 당신은 할 수 있습니다시도2개의 서로 다른/동일한 명령/출력을 동시에 실행합니다. 그러나 기대하는 것은동기화됨run은 일어날 가능성이 낮기 때문에 현명하지 못합니다.

귀하의 예를 들면 다음과 같습니다. 여기에서는 a라고 불리는 것을 소개합니다.가정 어구. 도로 표지판이나 신호등과 거의 동일합니다. 이것들가정 어구(에스)직접 흐름을 기반으로상태. 귀하의 예에서는~하는 동안"상태" --~하는 동안 이것, 하다저것. 일반적으로 조건리디렉션 stdin, stdout.

귀하의 2가지 직접적인 질문에 대한 직접적인 답변에서

  1. 파이프가 병렬로 작동합니까?

아니요. 반드시 그런 것은 아닙니다. 적어도 그 안에는 없어정상"평행"(탠덤)의 의미.

하지만 pipe ~할 수 있다화재 (개시) 2직업동시에. 심지어같은직업두 배.

  1. 파이프와 리디렉션이 "내부적으로" 어떻게 작동하나요?

위의 내용을 더 잘 설명했으면 좋겠습니다. :)

또는

cat ./ASCII | grep somename >./output

위의 cat ./ASCII내용은산출( stdout). 어느 것이입력( stdin) 의 방법으로파이프( |) 을 위한 grep somename. 어느 것이(재)지시( >) 를 최종 출력 으로 ./output.

관련 정보