输出下方的 Bash 提示 - 后台日志尾

iam*_*pet 15 linux shell bash tail

我曾经为一家公司工作,该公司有一个定制的 shell 来管理他们在 Linux 上运行的一个产品,我希望复制这个 shell 的一个关键特性。

所有工作都由后台进程完成,日志的输出显示给所有连接的用户。

日志会在你的 shell 的背景中拖尾,并且提示行将始终完美地停留在底部。

例如

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #
Run Code Online (Sandbox Code Playgroud)

我尝试使用 bash 执行此操作的方法是在用户 .bashrc 文件中启动一个分离的尾部,但是当命令的输出发送到 stdout 时 - 它出现在 bash 提示符下,例如

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3
Run Code Online (Sandbox Code Playgroud)

并且用户必须按 Enter 或CtrlC获得干净的提示行。

我不知道如何让提示总是跳到输出的底部,我认为我使用错误的术语在谷歌上找到任何东西,因为我运气不好 - 有谁知道如何做到这一点用 bash 吗?

Val*_*ami 11

答案是使用了 screen 或 tmux

我将解释如何使用 screen 进行配置

1) 使用apt-get install screenUbuntu/Debian 或yum install screenRedHat 衍生物安装屏幕 。

2) screen -S shell_and_logs

3) 然后按Ctrl+ a,然后按S(大写 S)。
将出现一个横屏

4) 按Ctrl+a然后按TAB
这将跳转到第二个拆分窗口。

5)在此处创建另一个窗口,以便通过按Ctrl+a释放键然后按来获得命令提示符c

6)可以通过按调整第二WINDO Ctrl+a然后键入:resize之后 Lines:会出现。输入要显示的行数。

7) 最后,您可以通过Ctrl+a后跟在窗口之间切换 TAB

请参阅下面的示例


Mic*_*nez 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
Run Code Online (Sandbox Code Playgroud)

关键是终端的 ANSI 控制字符。特别是设置新的可滚动区域的“\e[x;y”语句。因此,当读取日志文件的每一行时,窗口中的底部行将从可滚动区域中排除,插入日志文件中的行,然后将底部添加回来。