2011-03-08 47 views
2

我已经写了一个测试脚本,我通常从cygwin bash调用。该测试脚本使用转义序列对其输出颜色,即如何避免基于终端类型打印转义序列?

OKSTRING="\E[32;42mOK \033[39;49m" 
echo -e " $OKSTRING" 

如果成功。实际上,字符串OK不可见,因为前景和背景具有相同的颜色。所以,我只输出一个绿色,黄色或红色框来表示测试结果。

现在,我想运行与Hudson构建步骤相同的脚本。转义码使输出非常难以阅读。

是否有任何方法可以影响转义代码的打印而不必将更多信息传递给测试脚本本身?

我知道我可以使用命令行参数来做到这一点,并在我传递某个参数时重新定义OKSTRING。但是我正在寻找一些更简单的方法(即在脚本之外设置一些环境变量,并且echo知道它不应该打印转义序列)。

回答

3
if [ -t 1 ] 
then 
    echo -e "\E[32;42mstdout is a tty" 
else 
    echo "stdout is not a tty" 
fi 
+0

我觉得那很简单。谢谢! – eckes 2011-03-08 14:36:11

1

当我明白你的问题,在情况下,您手动从命令行运行脚本,你想拥有它的打印颜色代码,而当它是通过哈德森运行构建服务器,你希望它只是打印纯文本。

您可以测试终端是否被认为是tty与isatty库调用,尽管您可能有这种情况不会正是您想要的(即它可能会遗漏某些情况)。 Bash提供访问-t测试

-t fd 
    True if file descriptor fd is open and refers to a terminal. 

Accorting到LDP,以下是测试交互/非交互

if [[ -t 0 || -p /dev/stdin ]] 
then 
    echo interactive 
else 
    echo non-interactive 
fi 
1

的优先停留的方式如果使用tput而不是硬编码的逃生序列,您可以设置TERM变量来控制是否输出色码。它具有将输出移植到xterm之外的终端的好处。

$ printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S; echo -n hi; tput sgr0; echo 
[green box] 
$ (TERM=dumb; printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S; echo -n hi; tput sgr0; echo) 
hi 

第二个是在子shell运行,因此TERM返回到其先前的值时,子外壳退出。

为了避免重复调用tput,你可以把它在你的脚本的开头短短的时间,并设置变量来保存序列:

allgreen=$(printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S) 
none=$(tput sgr0) 
echo "${allgreen}hi${none}" 

然后,你可以打电话给你的脚本在子shell或预先安排变量赋值(或自己保存并恢复TERM)。

$ TERM=dumb ./your_script 

这使调用的本地分配。