如何根据终端类型避免打印转义序列?

时间:2011-03-08 14:23:04

标签: bash hudson escaping

我写了一个测试脚本,我通常从cygwin bash调用。此测试脚本使用转义序列为其输出着色,即

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

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

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

有什么方法可以影响转义码的打印,而不必将更多信息传递给测试脚本本身?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

据我所知,如果你从命令行手动运行脚本,你想让它打印颜色代码,而当它通过Hudson构建服务器运行时,你希望它只打印纯文本。 / p>

您可以测试终端是否被认为是isatty库调用的tty,尽管您可能遇到这种情况并不完全符合您想要的情况(即可能会遗漏某些情况)。 Bash提供对-t测试

的访问权限
-t fd
    True if file descriptor fd is open and refers to a terminal. 

根据LDP,以下是测试互动/非互动的优先方式

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

答案 2 :(得分: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中运行,因此当子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

这使得该调用在本地调用。