我写了一个测试脚本,我通常从cygwin bash调用。此测试脚本使用转义序列为其输出着色,即
OKSTRING="\E[32;42mOK \033[39;49m"
echo -e " $OKSTRING"
如果成功。实际上,字符串OK
不可见,因为前景和背景具有相同的颜色。所以,我只输出一个绿色,黄色或红色框来表示测试结果。
现在,我想运行与Hudson构建步骤相同的脚本。转义码使输出很难读取。
有什么方法可以影响转义码的打印,而不必将更多信息传递给测试脚本本身?
我知道我可以使用命令行参数执行此操作,并在传递某个参数时重新定义OKSTRING
。但我正在寻找一些更简单的方法(即在脚本之外设置一些环境变量,echo
知道它不应该打印转义序列。)
答案 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
这使得该调用在本地调用。