是否有一种标准方法可以反转终端输出的输出顺序,即:
~/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