bash - 使最后一个命令粘在终端窗口顶部,同时输出正常滚动

标签 bash shell terminal zsh oh-my-zsh

我想打印正在运行的命令以及在哪个目录中始终作为窗口的顶行,即使命令的输出通常会导致它滚动。我希望正常输出出现在下面并正常滚动。

我该怎么做?

最佳答案

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/

相关文章:

android - adb 无法在 bash 中使用变量

linux - 过去 X 小时的 Grep

linux - Unix 命令 rmdir 什么时候适合使用?

linux - 在 Fish Shell 中定义 Image Magick 的别名

io - 如何在超时的情况下从终端读取 UTF-8 字符?

linux - Bash 在 CSV 列中选择多个值

linux - 为什么这个 shell 命令不起作用? ('command' 有效但 'command|cat' 无效)

Bash:如何使用 bash 减去两个时间字符串?

linux - 计算文本中出现次数最多的字符

bash - 在包装 bash 脚本中设置管道