내 이해는 쉘의 파이프와 같은 것이 stdin을 a | b
stdout으로 리디렉션한다는 것입니다. 그런데 시도해 보았는데 동작이 이상했습니다. 연결된 출력의 내용을 표시합니다.b
a
ls | less < somefile
less
ls
somefile
이 현상을 설명할 수 있는 사람이 있나요?
답변1
당신의 이해는 정확하지 않습니다. 파이프를 통해 연결된 a | b
프로세스의 표준 출력 출력에서a
표준 입력의 과정 b
. 코드의 문제점은 somefile
process 에서 추가 리디렉션을 수행 함으로써 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의 출력과 아무 관련이 없습니다.