나는 stdin에서 읽을 ncurses 프로그램을 개발 중입니다. 그러나 다른 프로그램이 이 작업을 수행하는 방법을 확인하는 동안 일관성이 없다는 것을 알았습니다. 예를 들어 다음 두 가지는 정상적으로 작동합니다.
tail file.txt | cat
tail file.txt | cat -
비록 이러한에 익숙해내가 사용하지 않는 한 -
:
cat file.txt | vim
cat file.txt | file
-
왜 일부 프로그램에서는 파이핑 데이터를 허용하고 일부에서는 허용하지 않습니까? 이유가 있나요? 둘 다 지원해야 합니까?
답변1
으로 행동할 예정흐름 필터, 일부 입력 소스에서 데이터를 가져와 단계별로 처리하고 출력을 생성합니다. 일반적으로 옵션 인수가 아닌 호출 시 표준 입력에서 읽습니다. 예를 들어 등 cat
은 tail
기본적으로 표준 입력에서 읽는 것입니다. grep
, 기타 도구에는 sed
피연산자(grep의 경우 정규식, sed의 경우 스크립트)가 필요하며, 이것이 유일한 피연산자인 경우 표준 입력에서 읽습니다. Vi(m)은 이 모드에 적합하지 않습니다. 이는 스트림 필터가 아닌 대화형 프로그램이므로 인수를 전달하지 않으면 대화형 모드에서 시작됩니다.
file
-
예외입니다. stdin이 인수로 제공되지 않는 한(아마도 구문을 통해 ) stdin에서 읽히지 않습니다 . 왜 원저자나 POSIX 위원회 모두 stdin에서 읽지 않기로 결정했는지 모르겠습니다. 이는 file
파일 내용뿐만 아니라 파일 형식( file foo
보고서가 foo
디렉터리인지, 일반 파일인지, 심볼릭 링크인지 등) 에도 관심이 있기 때문일 수 있습니다. 따라서 흔히 사용되는 필터이지만 엄밀히 말하면 다른 필터와 같은 흐름 필터는 아닙니다. grep
(스트림 필터)와 ls
(파일 내용이 아닌 디렉토리 항목으로 파일만 고려) 사이에 있습니다 .
( grep -r
파일 형식에도 관심이 있지만 원래 명령보다 훨씬 늦게 추가되었습니다.)