Локальная почта (почти) никогда не проверяется в gnome-terminal, как я могу это изменить?

Контекст: я знаю, что "консольный" вход (с "Ctrl-Alt-Fx") обеспечивает проверку локальной почты (/var/mail/$USER), но пользователь Ubuntu не должен использовать это для повседневного использования. Вместо этого рекомендуется использовать gnome-terminal для взаимодействия с командной строкой.

Чего я ожидаю: когда я запускаю gnome-terminal, я ожидаю, что оболочка bash проверит локальную почту и соответственно сообщит "У вас новая почта", если есть новая почта. Но это не работает.

Что происходит вместо этого: 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 (большинства оболочек) для проверки почты, программа, которая фактически выполняет эту работу, - это login(1), которая находится вне конфигурации оболочки.

Здесь есть элегантный ответ о том, как login(1) играет роль во всем этом: bash - Почему MAIL не установлен в графической среде? - Обмен стеков Unix и Linux

С учетом сказанного, я использую следующую функцию для отображения уведомлений системной почты, если системная почта существует, на основе максимального интервала. Вам нужно будет найти подсказку, но это должно указать вам правильное направление. Надеюсь это поможет:

Следует использовать на терминалах в режиме "оболочки входа"...

# 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"
Другие вопросы по тегам