예를 들어 쉘을 사용하여 파이프를 생성할 때:
ls | cat
내가 확신하는 것은 stdin
for가 for가 cat
될 것이라는 것입니다 (즉, 여기 에 기록된 모든 내용은 이를 통해 읽혀질 것입니다 ).stdout
ls
ls
stdout
cat
stdin
이제 두 가지 질문이 있습니다.
- 에
stdin
대한 것인가 ?ls
stdout
cat
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).
ls
stderr가 파이프의 쓰기 끝으로 이동 하도록 하려면 ( cat
파이프의 다른 쪽 끝의 stdin에서 읽을 수 있도록) 다음을 수행할 수 있습니다.
ls 2>&1 | cat
"fd 2가 fd 1과 동일한 리소스를 가리키도록 만듭니다(여기에 파이프)."
csh
, tcsh
또는 버전 4.0 이상을 사용하면 다음과 같이 작성할 수도 zsh
있습니다 .bash
ls |& cat
파이프가 양방향인 시스템에서는 다음을 수행할 수 있습니다.
ls <&1 | cat >&0
의 표준 출력은 동일한 파이프를 통해 반대 방향으로 피드백되지만 cat
표준 입력을 읽지 않기 때문에 이는 의미가 없습니다.ls
ls
Linux에서는 파이프가 양방향이 아니므로 명령에서 오류가 발생합니다.