「cat」與「less」之間的標準輸入輸入行為

「cat」與「less」之間的標準輸入輸入行為

當我發出 時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_inost_rdev

至於為什麼less退出和cat不退出,你需要看看這兩個不同程序的目的。less是 GNU 尋呼機,是對 BSD 尋呼機的反應more(注意雙關語名稱)。對來自終端的輸入進行分頁並不完全有意義,但對來自管道的輸入進行分頁可能有意義。兩者都可以是標準輸入。編寫特殊情況是less有意義的。對特殊情況進行編碼cat是沒有意義的,並且會降低其有用性。即使在 20 世紀 80 年代末,人們也有視窗系統,並且會輸入cat > somefile然後將一大塊文字貼到「somefile」中。

相關內容