我曾经在一家公司工作,该公司有一个定制的 shell,用于管理在 Linux 上运行的一款产品,我希望复制这个 shell 的一个关键功能。
所有工作均由后台进程完成,日志的输出显示给所有连接的用户。
日志将在 shell 的后台尾部显示,并且提示行将始终完美地停留在底部。
例如
Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #
我尝试使用 bash 执行此操作的方式是在用户的 .bashrc 文件中启动一个独立的尾部,但是当命令的输出发送到 stdout 时 - 它出现在 bash 提示符下,例如
![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3
用户必须按下回车键或CtrlC按下回车键才能得到干净的提示行。
我不知道如何让提示总是跳转到输出的底部,而且我认为我使用了错误的术语在 Google 上查找任何内容,因为我没有运气 - 有人知道如何用 bash 做到这一点吗?
答案1
以下操作可满足您的需要,无需使用 tmux、screen 或其他程序。将提示保留在底部。将“/var/log/cron”替换为您需要的任何文件:
#!/bin/bash
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do
tput sc
printf "\e[1;${L1}r\e[${L1};${C}f"
echo; echo ${line}
printf "\e[1;${L}r" && tput rc
done
关键在于终端的 ANSI 控制字符。特别是“\e[x;y”语句,它设置了一个新的可滚动区域。因此,在读取日志文件的每一行时,窗口中的底行将从可滚动区域中排除,然后插入日志文件中的行,最后将底行添加回去。
答案2
答案是使用 screen 或 tmux
我将解释如何使用屏幕进行配置
apt-get install screen
1)使用Ubuntu/Debian 或yum install screen
RedHat 衍生版本安装屏幕 。
2) screen -S shell_and_logs
3)然后按Ctrl+ a,接着按S
(大写 S)。
将出现一个水平屏幕
4) 按Ctrl+a然后按TAB
这将跳转到第二个分割窗口。
Ctrl5)在此处创建另一个窗口,以便通过按下+a释放键然后按来获取命令提示符c
Ctrl6) 您可以通过按+来调整第二个窗口的大小,然后 a输入要显示的行数。:resize
Lines:
7)最后,您可以通过 Ctrl+a和TAB