![「cat」與「less」之間的標準輸入輸入行為](https://rvso.com/image/36024/%E3%80%8Ccat%E3%80%8D%E8%88%87%E3%80%8Cless%E3%80%8D%E4%B9%8B%E9%96%93%E7%9A%84%E6%A8%99%E6%BA%96%E8%BC%B8%E5%85%A5%E8%BC%B8%E5%85%A5%E8%A1%8C%E7%82%BA.png)
當我發出 時cat
,終端掛起等待標準輸入輸入。但是,當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 。無論哪種方式,重點是程式可以告訴有關文件描述符的信息,而 stdin 只是文件描述符 0。isatty(3)
fstat(2)
st_ino
st_rdev
至於為什麼less
退出和cat
不退出,你需要看看這兩個不同程序的目的。less
是 GNU 尋呼機,是對 BSD 尋呼機的反應more
(注意雙關語名稱)。對來自終端的輸入進行分頁並不完全有意義,但對來自管道的輸入進行分頁可能有意義。兩者都可以是標準輸入。編寫特殊情況是less
有意義的。對特殊情況進行編碼cat
是沒有意義的,並且會降低其有用性。即使在 20 世紀 80 年代末,人們也有視窗系統,並且會輸入cat > somefile
然後將一大塊文字貼到「somefile」中。