下推端子輸出

下推端子輸出

是否有一種標準方法可以反轉終端輸出的輸出順序,即:

~/Developer $ command0 
-bash: comman0: command not found 
~/Developer $ command2 
-bash: command2: command not found 
~/Developer $ command3 
-bash: command3: command not found 
~/Developer $ 

將顯示為:

~/Developer $ 
-bash: command3: command not found 
~/Developer $ command3 
-bash: command2: command not found 
~/Developer $ command2 
-bash: comman0: command not found 
~/Developer $ comman0

我覺得總是在底部顯示提示是違反直覺的,呈現輸出的更有效方法是反轉輸出順序。我該如何實施呢?具體來說,OSX 終端程式的輸出部分在哪裡定義?

答案1

在 bash 中,這將在頂部顯示當前提示/命令,在下面顯示其輸出,但沒有滾動或先前的命令:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'

此函數會將先前的命令放在下面,但您必須將每個命令單獨通過管道傳遞給它。不幸的是,exec > >(f)無法解決此問題,因為它會重定向整個 bash,而不是單一命令。這是函數:

f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }

然後運行每個命令,例如:

command args |f

它保存輸出,創建一些等於長度+1的空白行,然後將輸出放回原處。例如

printf '%*s' $COLUMNS | tr ' ' _;

作為整個函數的一個垃圾但自動的替代方案,我們可以在先前的 $PROMPT_COMMAND 的末尾添加一個命令,以清除有點任意的 11 行:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'

您也可以使用它tput -S來避免多次二進位呼叫。


我得到了$PROMPT_COMMAND來自https://github.com/swirepe/alwaysontop

答案2

不幸的是,這將相當困難。應用程式和 OS-X 終端之間的協定是VT100/ANSI終端控制協議,具體來說XTerm協定.

這包括一系列有關螢幕位置等的假設,重新映射到顯示相反的世界將具有挑戰性。

更糟的是,您的終端模擬器得到的只是一串「將此字元放在此位置」類型的命令。命令提示字元和它執行的命令的輸出之間沒有區別,因此您不能對這兩個部分都做一件事 - 至少在沒有底層 shell 的配合的情況下是這樣。

shell 和程式假定螢幕向上移動 - 新資料在底部,並永遠向下移動。

至少在理論上,您可以修改終端模擬器,以便以相反的順序顯示行 - 首先顯示“底”行,依此類推,直到螢幕底部的“頂”行。

不過,這會顛倒命令輸出中的行順序,因此其餘內容也會向後彈出。如果您希望命令(例如:ls、cat)「向下」運行,但提示「向上」移動,那么生活會更困難。

我不知道有什麼軟體可以實現這個功能。 (...但請參閱 JdeBD 對此的評論以獲得指向其中一個的連結。):)

答案3

儘管這不會完全反轉輸出,但它會將提示保留在頂部:

https://github.com/swirepe/alwaysontop

要使用它,請運行:

git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh

如果您決定喜歡它,只需將其來源到您的 .bash_profile 中,如下所示:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile

相關內容