리디렉션이 포함된 셸의 파이프

리디렉션이 포함된 셸의 파이프

내 이해는 쉘의 파이프와 같은 것이 stdin을 a | bstdout으로 리디렉션한다는 것입니다. 그런데 시도해 보았는데 동작이 이상했습니다. 연결된 출력의 내용을 표시합니다.bals | less < somefilelesslssomefile

이 현상을 설명할 수 있는 사람이 있나요?

답변1

당신의 이해는 정확하지 않습니다. 파이프를 통해 연결된 a | b프로세스의 표준 출력 출력에서a표준 입력의 과정 b. 코드의 문제점은 somefileprocess 에서 추가 리디렉션을 수행 함으로써 b동시에 두 가지 다른 방법을 사용하여 프로세스의 stdin에 연결한다는 것입니다 b. 그러지 마세요! 문제는 처음에 (이러한 구조를 통해) 무엇을 달성하려고 합니까?

답변2

어떤 쉘을 사용했는지 말하지 않았습니다. 설명하신 동작으로 판단하면 가능합니다 zsh. 매뉴얼 페이지를 보면 리디렉션이 어떻게 처리되는지 알 수 있습니다.

따라서 파이프는 암시적 리디렉션입니다.

  cat bar | sort <foo

cat bar foo | sort(입력 순서에 유의하세요) 와 동일합니다 .

bash그렇지 않으면 각 리디렉션이 해당 파일 설명자에 대한 이전 리디렉션을 대체하는 것이 일반적인 동작입니다 .

zsh매뉴얼 페이지는 계속됩니다:

MULTIOS 옵션이 설정되지 않은 경우 각 리디렉션은 해당 파일 설명자에 대한 이전 리디렉션을 대체합니다. 그러나 리디렉션된 모든 파일은 실제로 열리므로

  echo foo > bar > baz

MULTIOS가 설정되지 않은 경우 막대가 잘리고 "foo"가 baz에 기록됩니다.

답변3

특정 파일에서 더 적은 입력을 받기 때문입니다.

다음과 같이 작동합니다

1 -> ls를 실행합니다. 파이프를 사용했기 때문에 stdout을 다음 명령의 stdin으로 파이프합니다. 그게 바로 당신이 말하는 것입니다.

2 -> 두 번째 명령을 볼 것입니다. <somefile보다 작습니다.

보자마자'<'는 stdin을 다시 파일로 변경하도록 리디렉션합니다. 따라서 이전 변경 사항은 '|'가 손실되었기 때문입니다.

글쎄, 당신은 다음과 같이 말할 수 있습니다: less는 파일에서 입력을 받으며, ls의 출력과 아무 관련이 없습니다.

관련 정보