我使用 Windows 和 Putty 远程连接(ssh)到一些 Linux 服务器。我在 .screenrc 文件中设置了 hardstatus,以便可以监视一些有用的信息。但这仅在我在 Screen 中时才有效。
我希望在 Screen 之外使用同样的东西。因此,基本上,当我在 Screen 之外的 bash shell 上时,我希望有一个状态栏(类似于 Screen 的状态栏)。
这有可能吗?我该怎么做?如果不行,还有其他选择吗?
PS:我的目标是在状态栏中显示当前时间和更新服务器访问权限的截止日期。
答案1
很酷的问题。据我所知,正如 David Postill 所说,仅使用 Bash 无法做到这一点。但正如他所建议的,你可以(滥用)使用提示符来实现此目的。下面是使用ANSI 转义序列实现状态栏的效果:-)
PS1='\[\e[s\e[1;1H\e[41;1m\e[K\e[33;1m\][ *** \t *** ]\[\e[0m\e[u\]\w> '
这个只是在“状态栏”上显示当前时间,同时还显示常规提示。几点说明:
\e[
介绍大多数特殊命令\e[s
保存当前光标位置\e[1;1H
将光标定位在第 1 行、第 1 列\e[...m
改变(前景和背景)颜色\e[K
清除至行尾\e[u
恢复光标位置\[
并\]
分隔提示中的不可打印字符;它们让 Bash 计算提示的精确长度。原则上,你可以不用它们,但提示在多行命令中无法正确更新(但请参见下面的缺点)
我并不建议你认真对待这个解决方案。它有严重的缺点:
- 它很难读懂而且很脆弱
- 状态栏仅在提示更新时更新;即,当控制权返回到 shell 时(当我读到你的问题时,这是一个很大的缺点)
- 多行命令显示不正确(光标在第一行重新启动)
但我仍然希望你喜欢!:)
答案2
我很惊讶发现你的问题,因为我一个多星期前就遇到过类似的问题。
查看巴斯塔(Bash 状态行)。
这是具有少量外部依赖项(它需要stty
、sleep
和kill
)的 Bash 代码,您可以在其中获取它.bashrc
。
您会在终端底部看到一个滚动保护的持久状态行,其中显示时间、主机名和当前目录。
如果你查看历史记录,你就会发现我已调试了许多问题。
时钟以反向显示,并且更新即使 Bash 只是处于提示符下等待输入,也会自发地执行此操作。
这个小项目的动机是多年来提示太过混乱。我希望有一个$
提示,但仍然可以看到当前的工作目录和其他内容:而不是窗口标题,我的眼睛很少会看那里。
我也使用 PuTTY 和 screen;它在 screen 内部和外部都可以工作。到目前为止,我已经用 Termux、PuTTY 和 Gnome Terminal 进行了测试。
TERM
如果您想在屏幕内禁用它,您可能可以根据包含类似的变量来确定是否提供 Basta screen-256color
。
答案3
cyberninja216:
PS1='[\e[s\e[1;1H\e[41;1m\e[K\e[33;1m][ 反引号 curl ipinfo.io 2> /dev/null |grep -m 1 '"ip"'反引号][\e[0m\e[u]\w> '
注意反引号来分析命令输出。“用于实时反馈”
答案4
关于 Edwards 非常好的回答中的缺点#3,我可以补充一点:
可以安排额外的括号让 bash 正确计算空格并解析多行命令。
一个简化的例子是:
PS1='\[\e[s\e[1;1H\e[K\]\[[ \u@\w ]\]\[\e[0m\e[u\]$ '
将其分为 3 个部分
\[\e[s\e[1;1H\e[K\]
- 顶行部分(序言是一个好词吗?)\[[ \u@\w ]\]
- 顶线内容\[\e[0m\e[u\]$
- 提示部分
\[
注意和的额外实例\]
,它们告诉 bash 在对光标位置的字符进行“计数”时应该忽略哪些部分。