是否有一種標準方法可以反轉終端輸出的輸出順序,即:
~/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