TERM环境变量未设置

75

我有一个file.sh文件,运行时显示:TERM环境变量未设置。

smbmount //172.16.44.9/APPS/Interfas/HERRAM/sc5 /mnt/siscont5 -o 
iocharset=utf8,username=backup,password=backup2011,r

if [ -f /mnt/siscont5/HER.TXT ]; then
    echo "No puedo actualizar ahora"
    umount /mnt/siscont5
else 
    if [ ! -f /home/emni/siscont5/S5.TXT ]; then
        echo "Puedo actualizar... "
        touch /home/emni/siscont5/HER.TXT
        touch /mnt/siscont5/SC5.TXT
        mv -f /home/emni/siscont5/CCORPOSD.DBF /mnt/siscont5
        mv -f /home/emni/siscont5/CCTRASD.DBF /mnt/siscont5
        rm /mnt/siscont5/SC5.TXT
        rm /home/emni/siscont5/HER.TXT
        echo "La actualizacion ha sido realizada..."
    else
        echo "No puedo actualizar ahora: Interfaz exportando..."
    fi
fi
umount /mnt/siscont5
echo "/mnt/siscont5 desmontada..."

服务器运行正常,Cron每2分钟调用此.sh文件,但有时会显示TERM环境变量未设置,然后.sh文件不执行任何操作。 - meyquel
1
我在同一台服务器上有一些.sh文件,Cron会在不同的时间间隔内调用它们。 - meyquel
6个回答

107

您可以查看它是否真的未设置。运行命令set | grep TERM

如果没有设置,您可以像这样设置它:export TERM=xterm


75

在 cron 调用的脚本中使用终端命令,例如 "clear",会触发此错误消息。在您特定的脚本中,smbmount 命令希望有一个终端,在这种情况下,以上的解决方法是合适的。


16
这对我来说是一个问题。 - David Aleu
7
如果将clear(或其他终端命令)添加到.bashrc或从.bashrc调用的其他脚本中,将会产生相同的效果。 - madD7
在motd中有一个明显的问题 - 如果没有找到这篇文章,我怎么能解决它呢! - jamacoe
啊,就是这样,谢谢!现在我想找一个命令告诉我我是否在终端里?最好能用Python实现的。 - ullix
py: os.environ.get("TERM") bash: $TERM - Josiah DeWitt
确实!在Python中,当脚本从cron作业启动时,TERM的值为None。当从终端启动时,TERM的值为xterm-256color。因此,在cron作业中清除终端而不产生烦人的错误消息的方法是: 如果os.environ.get("TERM")不为None:os.system("clear") - ullix

6
您已经使用这个语句回答了问题:
每两分钟Cron调用这个.sh文件
Cron不在终端中运行,所以你为什么期望设置一个终端呢?
出现此错误消息的最常见原因是脚本尝试源用户的.profile,在执行某些tty相关操作之前没有检查它是否在终端中运行。解决方法包括使用以下shebang行:
#!/bin/bash -p 这会导致系统级别的配置文件脚本被源代码,(人们希望)不会尝试做任何太愚蠢的事情,并且在依赖于从终端运行时的代码周围有防护措施。
如果这是整个脚本的全部内容,那么TERM错误来自于脚本内容之外的其他东西。

其他.sh文件会在不同的时间间隔内被cron调用,当出现此错误时,重启命令无法正常工作... - meyquel
很抱歉,我很难理解您在这些评论中所说的内容。提到的shebang行应该位于脚本的开头 - 即第一行。没有提到另一个脚本,如果重启不起作用,但您正在以root身份运行,则系统可能存在其他问题。 - Anya Shenanigans

4
你可以将以下语句替换为:

export TERM=linux

这个方法即使在没有任何软件的系统内核下也能够正常使用。

0
如果您正在使用Docker PowerShell映像,请使用-e标志设置终端的环境变量,如下所示。
docker run -i -e "TERM=xterm" mcr.microsoft.com/powershell

0
已解决:在由CRONTAB(root)执行但作为www-data执行的脚本中添加“EXPORT TERM=xterm”即可解决Debian 10上的问题。 $ crontab -e
*/15 * * * * /bin/su - www-data -s /bin/bash -c '/usr/local/bin/todos.sh'

FILE=/usr/local/bin/todos.sh

#!/bin/bash -p
export TERM=xterm && cd /var/www/dokuwiki/data/pages && clear && grep -r -h '|(TO-DO)' > /var/www/todos.txt && chmod 664 /var/www/todos.txt && chown www-data:www-data /var/www/todos.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接