我有一个基于 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 设置(dumb
并screen
删除[OK]
)而有所不同,因此您可以假装拥有功能齐全的终端而不是屏幕:
TERM=xterm /etc/init.d/ntp status
它似乎也会检测它是否连接到终端。当您将输出通过管道传输到另一个进程时,这些信息[OK]
就会消失。
我认为这样做的原因是由于使用了转义码[OK]
,有一个检查可以防止它们在“未保存”环境中使用。转义序列实际上并没有添加任何内容,但它们可能会弄乱输出。
终端能力检查在 中完成/lib/lsb/init-functions
。有一个函数叫做log_use_fancy_output
它利用tput
:
tput
tput 实用程序使用 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]
跳过。