使用 GNU Screen 时,为什么守护程序状态消息中不显示“[ok]”?

使用 GNU Screen 时,为什么守护程序状态消息中不显示“[ok]”?

我有一个基于 debian 的系统(实际上是 Voyage Linux 0.9.1,它基于 debian wheezy),当我/etc/init.d/ntp status这样做时它会返回(例如)

$ /etc/init.d/ntp status
[ ok ] NTP server is running

但是,在屏幕会话(版本 4.01.00devel,2006 年 5 月 2 日)内[ ok ]不会显示。

$ screen
$ /etc/init.d/ntp status
NTP server is running

为什么会这样呢?以及如何在屏幕会话中显示它?

xterm-256color顺便说一句:在另一个 debian 服务器上(当我这样做时也会返回echo $TERM),我注意到它/etc/init.d/ntp status永远不会显示[ ok ],无论我是否处于屏幕会话中,所以这可能不是真正的screen问题。

答案1

它不需要屏幕。我们来实验一下:

TERM=dumb /etc/init.d/ntp status  # no [OK]
/etc/init.d/ntp status | cat      # also no [OK]

这也遗漏了[OK].由于显然输出根据 TERM 设置(dumbscreen删除[OK])而有所不同,因此您可以假装拥有功能齐全的终端而不是屏幕:

TERM=xterm /etc/init.d/ntp status

它似乎也会检测它是否连接到终端。当您将输出通过管道传输到另一个进程时,这些信息[OK]就会消失。

我认为这样做的原因是由于使用了转义码[OK],有一个检查可以防止它们在“未保存”环境中使用。转义序列实际上并没有添加任何内容,但它们可能会弄乱输出。

终端能力检查在 中完成/lib/lsb/init-functions。有一个函数叫做log_use_fancy_output它利用tput:

tputtput 实用程序使用 terminfo 数据库使与终端相关的功能和信息的值可供 shell 使用

它发出以下两个命令:

tput hpa 60
tput setaf 1

tput:便携式终端控制Bash 提示符 HOWTO - 颜色和光标移动:

hpa          - Move cursor to column #1
setaf [1-7]  - Set a foreground colour using ANSI escape

特别是log_use_fancy_output检查它是否连接到终端。然后,它检查 TERM 是否为空或设置为哑,以及这两个tput操作是否成功。如果成功,则[OK]打印 ,否则[OK]跳过。

相关内容