Less
less
如何從標準輸入獲取數據,同時仍然能夠讀取使用者的命令?
正如你們大多數人多次做過的那樣,使用以下命令查看長文本很方便
less
:some_command | less
現在它的標準輸入連接到一個管道(FIFO)。它怎麼還能讀取像 up/down/quit 這樣的命令?
正如William Pursell所提到的,
less
從終端讀取使用者的擊鍵。它顯式打開/dev/tty
控制終端;這給了它一個與標準輸入分開的文件描述符,它可以從中讀取使用者的互動式輸入。如有必要,它可以同時從其標準輸入讀取數據以顯示。(如有必要,它也可以直接寫入終端。)您可以通過執行看到這種情況
some_command | strace -o less.trace -e open,read,write less
移動輸入,退出
less
並查看less.trace
: 你會看到它的內容 open/dev/tty
,並從文件描述符 0 和打開時返回的任何一個/dev/tty
(可能是 3)中讀取。對於希望確保它們正在從終端讀取和寫入終端的程序來說,這是一種常見的做法。一個例子是 SSH,例如當它要求輸入密碼或密碼時。
正如schily所解釋的,如果無法打開,將從其標準錯誤(文件描述符 2)中讀取。的使用是在 1991 年 4 月 2 日發布的版本 177 中引入的。
/dev/tty``less``less``/dev/tty
如果您按照Hagen von Eitzen的建議
cat /dev/tty | less
嘗試執行,將成功打開,但在關閉之前不會從中獲得任何輸入。所以你會看到螢幕空白,在你按下殺死(或以其他方式殺死它)之前什麼都沒有;然後將顯示您在執行時鍵入的任何內容,並允許您控制它。less``/dev/tty``cat``Ctrl``C``cat``less``cat