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 screen
Ubuntu/Debian 或yum install screen
RedHat 衍生物安装屏幕 。
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
以下代码可以满足您的需要,无需使用 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”语句。因此,当读取日志文件的每一行时,窗口中的底部行将从可滚动区域中排除,插入日志文件中的行,然后将底部添加回来。
归档时间: |
|
查看次数: |
1805 次 |
最近记录: |