!["cat"과 "less" 사이의 표준 입력 입력 동작](https://linux55.com/image/36024/%22cat%22%EA%B3%BC%20%22less%22%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%ED%91%9C%EC%A4%80%20%EC%9E%85%EB%A0%A5%20%EC%9E%85%EB%A0%A5%20%EB%8F%99%EC%9E%91.png)
을 실행하면 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 less
이 isatty(3)
. 또 다른 옵션은 파일 설명자 0을 호출하고 fstat(2)
합계 필드의 값을 해석하는 것입니다. 어느 쪽이든 요점은 프로그램이 파일 설명자에 대한 정보를 알려줄 수 있고 stdin은 파일 설명자 0일 뿐이라는 것입니다.st_ino
st_rdev
less
그만둬야 하는 이유와 그만 두지 말아야 하는 이유에 대해서는 cat
이 두 가지 다른 프로그램의 목적을 살펴볼 필요가 있습니다. less
BSD 호출기에 대한 반응인 GNU 호출기입니다 more
(이름에 말장난이 있습니다). 터미널의 입력에 페이지를 매기는 것은 정확히 의미가 없지만 파이프의 입력에 페이지를 매기는 것은 의미가 있을 수 있습니다. 둘 다 표준 입력이 될 수 있습니다. 특별한 경우를 작성하는 것이 less
합리적입니다 . 특별한 경우를 코딩하는 것은 cat
의미가 없으며 유용성을 감소시킵니다. 1980년대 후반에도 사람들은 윈도우 시스템을 사용하여 cat > somefile
"somefile"에 텍스트 덩어리를 입력하고 붙여넣었습니다.