"cat"과 "less" 사이의 Stdin 입력 동작

"cat"과 "less" 사이의 Stdin 입력 동작

을 실행하면 cat터미널이 stdin 입력을 기다리면서 멈춥니다. 그러나 less발행되면 Missing filename ("less --help" for help). less및 모두 catstdin 입력을 허용하는 것으로 알려져 있습니다 . 차이점은 무엇입니까? 이것이 매뉴얼 페이지에 어떻게 반영됩니까?

답변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_inost_rdev

less종료되는 이유와 종료되지 않는 이유 에 대해서는 cat두 가지 다른 프로그램의 목적을 살펴봐야 합니다. lessBSD 호출기에 대한 반응인 GNU 호출기입니다 more(재미있는 이름을 참고하세요). 터미널의 입력에 페이지를 매기는 것은 정확히 의미가 없지만 파이프의 입력에 페이지를 매기는 것은 의미가 있을 수 있습니다. 둘 중 하나가 표준 입력일 수 있습니다. 특별한 경우를 코딩하는 것이 less합리적입니다. 특별한 경우를 코딩하는 것은 cat의미가 없으며 유용성을 감소시킵니다. 1980년대 후반에도 사람들은 윈도우 시스템을 사용하여 입력한 cat > somefile다음 "somefile"에 많은 양의 텍스트를 붙여넣었습니다.

관련 정보