을 실행하면 cat
터미널이 stdin 입력을 기다리면서 멈춥니다. 그러나 less
발행되면 Missing filename ("less --help" for help)
. less
및 모두 cat
stdin 입력을 허용하는 것으로 알려져 있습니다 . 차이점은 무엇입니까? 이것이 매뉴얼 페이지에 어떻게 반영됩니까?
답변1
less
파일 이름 인수가 제공되지 않은 경우 다음 코드를 실행합니다.
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
return (edit("-"));
표준 입력이 터미널일 때 불평합니다. 표준 입력이 일반 파일이나 파이프라면 괜찮습니다.
아마도 각 페이지 끝에서 터미널로부터 응답을 읽어야 하고 페이징되는 데이터와 응답을 구별할 방법이 없기 때문에 이 작업을 수행하는 것으로 보입니다.
이것은 매뉴얼 페이지에 언급되어 있지 않습니다. 아마도 그래야 할 것입니다.
cat
출력을 페이징하지 않으며 터미널에서 응답을 읽지 않습니다. stdin이 터미널인 한 어떤 제한도 없습니다.
답변2
less
내 생각엔 파일 설명자 0을 호출하는 것 같습니다 isatty(3)
. 또 다른 대안은 파일 설명자 0을 호출 하고 및 필드 fstat(2)
의 값을 해석하는 것 입니다 . 어느 쪽이든 요점은 프로그램이 파일 설명자에 대해 무언가를 알 수 있고 stdin은 파일 설명자 0일 뿐이라는 것입니다.st_ino
st_rdev
less
종료되는 이유와 종료되지 않는 이유 에 대해서는 cat
두 가지 다른 프로그램의 목적을 살펴봐야 합니다. less
BSD 호출기에 대한 반응인 GNU 호출기입니다 more
(재미있는 이름을 참고하세요). 터미널의 입력에 페이지를 매기는 것은 정확히 의미가 없지만 파이프의 입력에 페이지를 매기는 것은 의미가 있을 수 있습니다. 둘 중 하나가 표준 입력일 수 있습니다. 특별한 경우를 코딩하는 것이 less
합리적입니다. 특별한 경우를 코딩하는 것은 cat
의미가 없으며 유용성을 감소시킵니다. 1980년대 후반에도 사람들은 윈도우 시스템을 사용하여 입력한 cat > somefile
다음 "somefile"에 많은 양의 텍스트를 붙여넣었습니다.