Linux

在可滾動尋呼機中查看命令輸出

  • August 24, 2020

我想從頂部查看命令的輸出並防止終端跳下,我想要一種獨立於終端的方式。因此無需更改終端特定配置。我嘗試使用這樣的less命令:

command | less

但是在我使用的命令中,尋呼機在命令輸出完成後退出。

如何獲得命令輸出實時流式傳輸到尋呼機的行為,但我可以從上到下查看它?

問題是我沒有將 stderr 輸出重定向到less,出於某種原因:

command 2>&1 | less 

產生所需的行為。

通過使用less -R,您可以保留從 重定向的彩色輸出command,但是某些命令在其輸出被重定向時會自動省略著色,您需要尋找一個選項,例如--color=always始終獲得彩色輸出。

就我而言,我現在將輸出重定向到bat,它是 的複製cat,具有更多功能,帶有選項和--paging=always,並且我使用s 選項:--pager="less -RFX"``--number``cargo build``--color=always

cargo build --color=always 2>&1 | bat --paging=always --pager="less -RFX" --number

這會產生帶有編號的行的漂亮、可滾動、彩色輸出:

  1    Compiling openlimits v0.1.0 (/home/####/git/openlimits)
  2 error[E0433]: failed to resolve: use of undeclared type or module `tokio`
  3   --> src/binance/client/websocket.rs:15:5
  4    |
  5 15 | use tokio::net::TcpStream;
  6    |     ^^^^^ use of undeclared type or module `tokio`
  7
  8 error[E0433]: failed to resolve: use of undeclared type or module `tokio_tungstenite`
  9   --> src/binance/client/websocket.rs:16:5
 10    |
 11 16 | use tokio_tungstenite::{
 12    |     ^^^^^^^^^^^^^^^^^ use of undeclared type or module `tokio_tungstenite`
 13
 14 error[E0433]: failed to resolve: use of undeclared type or module `tokio`
 15   --> src/coinbase/client/websocket.rs:10:5
 16    |
 17 10 | use tokio::net::TcpStream;
 18    |     ^^^^^ use of undeclared type or module `tokio`
 19
....

然後我將選項放在我的配置文件中batcargo以使它們隱含,現在我在鍵入時得到了這種行為

cargo build 2>&1 | bat

在 bash 中,顯然您可以使用&>而不是2>&1. 它們是等價的。 在 zsh 中,這似乎不起作用,儘管它是以這種方式記錄的

沒有在輸入結束時退出

預設情況下,只有在使用 quit 命令 ( q) 時,less 才會自動退出。

如果您less使用 option呼叫-E,它將在到達文件末尾時退出。使用選項-e,當您嘗試移過文件末尾時(例如通過重複滾動),它會退出。使用選項-F,如果文件完全顯示在一個螢幕上,less 將立即退出。預設情況下,這些選項均未啟用,但有幾種方法可以將它們設為系統的預設設置:

  • less可能是帶有選項的 shell 別名。檢查與alias less
  • LESSLess啟動時從環境變數中讀取選項。檢查與echo $LESS
  • Less 有一個配置文件。它的預設位置.less在您的主目錄中;這可以通過設置環境變數來改變LESSKEY。文件格式為二進制,但如果以這種方式設置選項,則字元串LESS和選項都會出現在文件中。
  • 這不太可能,但是如果LESS_IS_MORE設置了環境變數, less 的行為就像舊的實用程序一樣more,包括預設退出文件末尾。

在完成之前查看命令輸出

當您將命令的輸入通過管道傳輸到 less ( mycommand | less) 時,less 會繼續讀取,直到命令完成。您可以使用 來減少中斷Ctrl+C,但是您將無法從該命令讀取任何進一步的輸出,並且該命令可能由於管道損壞而死。這是因為 less 在停止讀取時會關閉管道。

解決此問題的方法是將命令輸出到文件並在該文件上呼叫 less。當從文件中讀取較少時,您可以鍵入F然後Ctrl+C使其從文件中讀取更多數據,然後繼續瀏覽。

mycommand >log 2>&1 &
less log

程序的行為可能略有不同,具體取決於它們的輸出是終端、管道還是文件。如果您發現當輸出是文件或管道而不是終端時輸出延遲,那是由於輸出緩衝。請參閱關閉管道中的緩衝

script實用程序在虛擬終端中執行程序並將整個輸出記錄到文件中。就程序而言,它正在將輸出寫入終端。例如,該程序可以使用顏色轉義序列。將-R選項傳遞給 less 以使其將終端轉義序列傳遞給終端,而不是以轉義形式顯示控製字元。

script -c 'mycommand --option || echo "mycommand failed with status $?"' mycommand.log </dev/null >/dev/null &
less -R mycommand.log

引用自:https://unix.stackexchange.com/questions/605781