"cat"과 "less" 사이의 표준 입력 입력 동작

"cat"과 "less" 사이의 표준 입력 입력 동작

을 실행하면 cat터미널이 stdin의 입력을 기다리면서 멈춥니다. 그러나 less게시되었을 때 나는 그것을 얻었습니다 Missing filename ("less --help" for help). 우리 모두 알고 있듯이 less및 표준 입력 입력을 모두 cat허용합니다. 차이점은 무엇입니까? 이것이 매뉴얼 페이지에 어떻게 반영됩니까?

답변1

less파일 이름 인수가 제공되지 않으면 다음 코드가 실행됩니다.

if (isatty(fd0))
{
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
}
return (edit("-"));

표준 입력이 터미널일 때 불평합니다. 표준 입력이 일반 파일이나 파이프라면 괜찮습니다.

아마도 각 페이지 끝에서 터미널의 응답을 읽어야 하고 페이징되는 데이터와 응답을 구별할 수 없기 때문에 이렇게 하는 것 같습니다.

매뉴얼 페이지에는 이에 대한 언급이 없습니다. 아마도 그래야 할 것입니다.

cat출력을 페이징하지 않으며 터미널에서 응답을 읽지도 않습니다. stdin이 터미널에 관한 한 제한이 없습니다.

답변2

내 생각엔 파일 설명자 0 lessisatty(3). 또 다른 옵션은 파일 설명자 0을 호출하고 fstat(2)합계 필드의 값을 해석하는 것입니다. 어느 쪽이든 요점은 프로그램이 파일 설명자에 대한 정보를 알려줄 수 있고 stdin은 파일 설명자 0일 뿐이라는 것입니다.st_inost_rdev

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

관련 정보