语境 :我知道“控制台”登录(使用“Ctrl-Alt-Fx”)提供了本地邮件检查(/var/mail/$USER),但 Ubuntu 用户不应该使用它来日常使用。相反,建议使用 gnome-terminal 进行命令行交互。
我的期望是: 当我启动 gnome-terminal 时,我希望 bash shell 检查本地邮件,如果有新邮件,则报告“您有新邮件”。但是它不起作用。
实际情况是: gnome-terminal 调用 bash 时未设置 $MAIL(和 $MAILCHECK)变量。这就是为什么用户永远不会收到有关新本地邮件的通知。
我尝试过: 我输入了 ~/.bashrc :
export MAIL=/var/mail/$USER
export MAILCHECK=60
而且……它实际上不起作用。只有当我在 gnome-terminal 运行时收到新邮件时,它才会起作用:在这种情况下,我将在下一个命令行提示符中看到“您有新邮件”。如果我在 gnome-terminal 未运行时收到新邮件,然后启动 gnome-terminal:根本没有通知。
有什么想法吗?(据记录,我使用的是 Ubuntu 19.10)
答案1
简而言之,虚拟终端无法控制操作系统登录操作。就填充 bash(大多数 shell)检查邮件的“正确内容”而言,实际执行此工作的程序是 login(1) - 它位于 shell 配置之外。
关于 login(1) 如何在所有这些中发挥作用,这里有一个优雅的答案:bash - 为什么在图形环境中未设置 MAIL? - Unix & Linux Stack Exchange
话虽如此,我使用以下函数根据最大间隔显示系统邮件通知(如果系统邮件存在)。您必须弄清楚提示钩子,但这应该会为您指明正确的方向。希望这能有所帮助:
应与终端上的“登录 shell”模式一起使用......
# add to your ~/.profile or equivelant
MAIL_CHECK_TIME=0
mypromt()
{
local pwd='~'
local MAIL_SECONDS_DIFF=$MAILCHECK
local MAIL_ELAPSED_SECONDS=$((SECONDS - MAIL_CHECK_TIME))
[ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
printf "\033]0;%s@%s:%s\033\\%s" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
# if [ ! "$SSH_CONNECTION" ]; then
if [[ "$MAIL_CHECK_TIME" -eq "0" || "$MAIL_ELAPSED_SECONDS" -gt "$MAIL_SECONDS_DIFF" ]]; then
local MAILX="$(mailx 2>/dev/null &)"
local COUNT=$(echo "$MAILX" | wc -l)
local COUNT=$((COUNT-3))
local MESSAGE_TEXT="message"
if [ "$COUNT" -gt "0" ]; then
if [ "$COUNT" -gt "1" ];then
MESSAGE_TEXT="messages"
fi
printf "You have $COUNT mail $MESSAGE_TEXT.\n \033]0;%s@%s:%s\033\\%s" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
fi
MAIL_CHECK_TIME=$SECONDS
fi
# fi
# echo "seconds: $SECONDS"
# echo "check: $MAIL_CHECK_TIME"
# echo "elapsed: $MAIL_ELAPSED_SECONDS"
}
# uses mx linux /etc/profile.d prompt hook
PROMPT_COMMAND="mypromt"