我有一个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窗口才能恢复回到我平常的颜色。有没有办法防止在我的脚本中发生这种情况?
感谢。
答案 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。在这种情况下,相同的错误输出可用于交互式和记录结果,而不会使用控制字符污染日志。