下推端子输出

下推端子输出

是否有一种标准方法可以反转终端输出的输出顺序,即:

~/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

相关内容