我想打印正在运行的命令以及在哪个目录中始终作为窗口的顶行,即使命令的输出通常会导致它滚动。我希望正常输出出现在下面并正常滚动。
我该怎么做?
最佳答案
GNU screen无法 ( yet ) 将您请求的内容放在 View 的顶部,但可以使用 caption
将其放在底部包括硬状态行(窗口标题):
% print 'caption always "%h"\nterm $TERM' > ~/.screenrc
% screen
% precmd() { print -Pn "\e]0;[%~] "; print -Rn "$1"; print -Pn "\e\\"; }
% preexec() { precmd "$1"; }
请注意:第一行将覆盖您的 ~/.screenrc
,您可能不想这样做。
这将在终端底部显示一个颜色反转的状态行,其中包含方括号中的路径,然后是当前正在运行的命令(如果有)。在您的主目录中使用 cd/tmp; 尝试一下例如, sleep 1。它将显示 [~] cd/tmp; sleep 1
一秒钟,然后它会变为 [/tmp]
。
precmd()
和 preexec()
是 zsh hook functions 。 ZSH 在渲染提示符之前运行 precmd()
。在执行命令之前,zsh 运行 preexec()
,并将 $1
设置为整个命令。 (使用$2
来遍历别名。)
上面的 precmd()
有三个 print
调用,以确保转义码受到命令行的限制(-R
抑制转义序列插值) ,-P
启用路径变量扩展,-n
抑制尾随换行符)。 \e]0;
是启动状态行的几种方法之一,而 \e\\
是结束状态行的几种方法之一。上面的 preexec()
将命令传递给 precmd()
。
保存 ~/.screenrc
后,您可以将以下内容放入 ~/.zshrc
中,以使这种情况始终发生:
if [ -z "$STY" ]; then screen -r 2>/dev/null || screen; fi
precmd() { print -Pn "\e]0;[%~] "; print -Rn "$1"; print -Pn "\e\\"; }
preexec() { precmd "$1"; }
如果您尚未进入此类 session ,第一行将启动 screen
(如果有的话,它会尝试恢复分离的 session ,否则会启动一个新 session )。后两行如上所述。
请小心,如果您关闭终端而不退出 shell(因此退出屏幕),屏幕 session 将继续 headless 运行。当涉及到断开连接的远程 SSH session 时,这是一个功能,但它在本地没有那么有用。
关于bash - 使最后一个命令粘在终端窗口顶部,同时输出正常滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56120739/