防止Unix命令行采用bash颜色?

时间:2016-02-01 21:07:54

标签: bash unix sh

我有一个Bash脚本,我在Mac上运行iTerm 2.1.3。如果出现错误,我喜欢使用颜色代码来更改脚本输出的颜色:

#!/usr/bin/env bash

database=mydb
RED='\033[0;31m'

echo -e "[Dumping database '$database']"
pg_dump -Fc -v -f /tmp/${database}.bak ${database}
if [ "$?" -ne 0 ]; then
    printf "\n${RED}Database dump failed${NC}\n"
    exit 1
fi

问题是,如果从Unix命令行运行此脚本时出现错误,那么我的命令行会显示错误输出的颜色(在本例中为红色),我必须关闭iTerm窗口才能恢复回到我平常的颜色。有没有办法防止在我的脚本中发生这种情况?

感谢。

1 个答案:

答案 0 :(得分:2)

糟糕!你忘了设置一个变量!您的脚本使用${NC}来标准化颜色,但其声明无处可见。

您可能还希望使用格式引号而不是单引号使分配更漂亮。

#!/usr/bin/env bash

database=mydb

if [ -t 0 ]; then
    RED=$'\e[0;31m'
    NC=$'\e[0m'
else
    RED=""
    NC=""
fi

printf "[Dumping database '%s']\n" "$database"
pg_dump -Fc -v -f /tmp/${database}.bak ${database}
if [ "$?" -ne 0 ]; then
    printf "\n${RED}Database dump failed${NC}\n"
    exit 1
fi

请注意,我已经从echo -e切换到printf,这更加便携(如果您决定要在不使用bash的地方运行,但仍然包括格式引号,如FreeBSD' s / bin / sh)。

还要注意测试[ -t 0 ]如果在终端上运行则返回true。在这种情况下,相同的错误输出可用于交互式和记录结果,而不会使用控制字符污染日志。