是否有一种标准方法可以反转终端输出的输出顺序,即:
~/Developer $ command0
-bash: comman0: command not found
~/Developer $ command2
-bash: command2: command not found
~/Developer $ command3
-bash: command3: command not found
~/Developer $
Run Code Online (Sandbox Code Playgroud)
将显示为:
~/Developer $
-bash: command3: command not found
~/Developer $ command3
-bash: command2: command not found
~/Developer $ command2
-bash: comman0: command not found
~/Developer $ comman0
Run Code Online (Sandbox Code Playgroud)
我觉得总是让你的提示在底部是违反直觉的,一种更有效的呈现输出的方式是颠倒输出顺序。我该如何去实施这个?具体来说,OSX 终端程序的输出部分在哪里定义?
不幸的是,这将是相当困难的。应用程序和 OS-X 终端之间的协议是VT100/ANSI终端控制协议的变体,特别是XTerm协议。
这包括一系列关于屏幕位置等的假设,重新映射到显示反转的世界将是一项挑战。
更糟糕的是,你的终端模拟器得到的只是一串“把这个字符放在这个位置”类型的命令。命令提示符和由它运行的命令的输出之间没有区别,因此您不能对这两个部分做一件事 - 至少,如果没有下面的 shell 的合作。
外壳程序和程序假定屏幕向上进行 - 底部有新数据,并永远向下进行。
至少在理论上,您可以修改终端仿真器,使其以相反的顺序显示行 - 首先显示“底部”行,直到屏幕底部的“顶部”行。
但是,这会颠倒命令输出中的行顺序,因此其余内容也会向后弹出。如果您希望命令(例如:ls、cat)“向下”运行但提示“向上”移动,则生活会更难。
我不知道任何实现此功能的软件。(...但请参阅 JdeBD 对此的评论以获取链接。):)
在 bash 中,这将在顶部显示当前提示/命令,在下面显示其输出,但没有滚动或以前的命令:
PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'
Run Code Online (Sandbox Code Playgroud)
这个函数将把以前的命令放在下面,但你必须单独将每个命令通过管道传递给它。不幸的是,exec > >(f)
这无济于事,因为它重定向了整个 bash,而不是单个命令。这是函数:
f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }
Run Code Online (Sandbox Code Playgroud)
然后运行每个命令,如:
command args |f
Run Code Online (Sandbox Code Playgroud)
它保存输出,创建一些等于 length+1 的空行,然后将输出放回原处。您可以在末尾标记一行,如果您愿意,该行将显示假提示或水平线。例如
printf '%*s' $COLUMNS | tr ' ' _;
Run Code Online (Sandbox Code Playgroud)
作为这整个函数的一个废话但自动的替代方案,我们可以在我们之前的 $PROMPT_COMMAND 末尾添加一个命令来清除有点随意的 11 行:
PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'
Run Code Online (Sandbox Code Playgroud)
您还可以使用tput -S
避免多次二进制调用。
我$PROMPT_COMMAND
从https://github.com/swirepe/alwaysontop得到了。
小智 6
虽然这不会完全反转输出,但它会使您的提示保持在顶部:
https://github.com/swirepe/alwaysontop
要使用它运行:
git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh
Run Code Online (Sandbox Code Playgroud)
如果您决定喜欢它,只需在您的 .bash_profile 中使用以下内容获取它:
echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)