stdin, stdout 및 stderr에 대한 쉘 파이프 연산자의 효과

stdin, stdout 및 stderr에 대한 쉘 파이프 연산자의 효과

예를 들어 쉘을 사용하여 파이프를 생성할 때:

ls | cat

내가 확신하는 것은 stdinfor가 for가 cat될 것이라는 것입니다 (즉, 여기 에 기록된 모든 내용은 이를 통해 읽혀질 것입니다 ).stdoutlslsstdoutcatstdin

이제 두 가지 질문이 있습니다.

  1. stdin대한 것인가 ?​lsstdoutcat
  2. stderr둘 모두에 해당 ls되며 cat파이프 연산자의 영향을 받나요, 아니면 여전히 stderr셸에서 값을 상속받나요?

답변1

기술적으로 말하자면,ls | cat

  • (fd 1)은 ls파이프(또는 일부 시스템에서는 ksh93이 있는 소켓 쌍)의 쓰기 끝이 됩니다.
  • stdin(fd 0)은 cat동일한 파이프의 읽기 끝이 됩니다.
  • 두 명령이 동시에 실행됩니다(별도의 프로세스에서 동시에 시작됨).
  • stdin ls은 영향을 받지 않습니다(문제 1).
  • stdout cat은 영향을 받지 않습니다(문제 1).
  • stderr(fd 2) ls또는 cat영향을 받지 않음(문제 2).

lsstderr가 파이프의 쓰기 끝으로 이동 하도록 하려면 ( cat파이프의 다른 쪽 끝의 stdin에서 읽을 수 있도록) 다음을 수행할 수 있습니다.

ls 2>&1 | cat

"fd 2가 fd 1과 동일한 리소스를 가리키도록 만듭니다(여기에 파이프)."

csh, tcsh또는 버전 4.0 이상을 사용하면 다음과 같이 작성할 수도 zsh있습니다 .bash

ls |& cat

파이프가 양방향인 시스템에서는 다음을 수행할 수 있습니다.

ls <&1 | cat >&0

의 표준 출력은 동일한 파이프를 통해 반대 방향으로 피드백되지만 cat표준 입력을 읽지 않기 때문에 이는 의미가 없습니다.lsls

Linux에서는 파이프가 양방향이 아니므로 명령에서 오류가 발생합니다.

관련 정보