我试图通过 cron 运行一个 bash 脚本,在执行开始时出现以下错误:
tput: No value for $TERM and no -T specified
这是我的 crontab 中的内容:
0 8 * * 1-5 cd /var/www/inv/ && /var/www/inv/unitTest run all 2>&1| mail -r "[email protected]" -s "Daily Inventory Unit Test Results" [email protected]
答案1
您的单元测试脚本可能会调用tput
以生成漂亮的输出,显示哪些测试通过和失败。由于cron
没有终端,因此也没有终端类型($TERM
),因此tput
无法控制不存在的终端。
您的单元测试脚本需要有两种模式:
- 在终端上运行:它可以调用
tput
以生成漂亮的输出 - 不在终端上运行:它不应该调用
tput
,而是生成一个通用的纯文本输出格式,该格式适合通过管道传输到电子邮件中,就像您在这里所做的那样。
单元测试了解它们是否在终端上运行的最简单方法是测试引用终端的 stdio 文件描述符。如果是 shell 脚本,则:
if [ -t 1 ]; then
tput bold; echo pretty; tput sgr0
else
echo ugly
fi
基本上:除非您在终端上运行,否则不要调用tput
,这样您就可以避免出现错误,并且无论您碰巧在哪种模式下运行,都会产生合理的输出。
答案2
扩展上面 Celada 给出的答案(我必须发布答案而不是评论,因为我还没有足够高的声誉分数来评论其他答案)...
根据建议TLDP.org,有可能[ -t 0 ]
可以在本地终端上工作,但通过 ssh 远程调用时会失败。
因此,您还需要检查套接字是否存在。以下是检查终端或套接字的示例。
if [[ -t 0 || -p /dev/stdin ]]
then
echo interactive
else
echo non-interactive
fi