명령을 통해 파이핑한 후 표준 입력 비교

명령을 통해 파이핑한 후 표준 입력 비교

나는 다음과 같은 형식을 원합니다(빈칸 채우기):

cmd1 | ____ cmd2 ____

이는 다음과 동일하지만 파일을 쓰지 않습니다.

cmd1 > temp
cmd2 < temp | diff temp -

cmd1은 실제로 명령이 아니며 텍스트 편집기의 표준 입력 스트림이므로 여러 번 실행할 수 없으므로 작동하지 않습니다.

diff <(cmd1) <(cmd1 | cmd2)

그러나 그것은 본질적으로 내가 원하는 것입니다.

저는 macOS를 사용하고 있지만 Linux와 호환되는 것을 선호합니다.

답변1

일반적으로 파일에 쓰고 싶지 않은 경우 (명명된) 파이프로 바꿀 수 있지만 파이프는 두 프로세스에서 동시에 읽을 수 없습니다. 귀하의 경우 tee분할 입력을 사용하고 한쪽 끝에 명명된 파이프를 사용할 수 있습니다.

mkfifo p
cmd1 | tee p | cmd2 | diff p -
rm p

그러나 여기에는 큰 단점이 있습니다. 파이프에는 제한된 버퍼(Linux에서는 64k)가 있으므로 diff가 파이프 중 하나를 읽고 다른 파이프와 너무 많은 것을 비교하면 전체 파이프가 교착 상태가 됩니다. 이 문제는 buffer하나 이상의 파이프가 포함된 명령을 사용하여 피할 수 있습니다 .

mkfifo p
cmd1 | tee p | cmd2 | buffer | diff p -
rm p

당신은 또한 볼 수 있습니다여기다른 버퍼링 옵션의 경우.

교착 상태에 대한 또 다른 해결책은 변수를 사용하여 전체 cmd1출력을 버퍼링하는 것입니다(메모리에 로드).

cmd1 | ( b=$(cat); cmd2 <<<"$b" | diff <(echo "$b") - )

관련 정보