Коротко — причина в том, что процесс-предок вашей сессии открыл fd 2 в /dev/null (либо shell в каких‑то файл‑скриптах сделал `exec 2>/dev/null`, либо systemd запустил службу с `StandardError=null`). Надо найти этот процесс и устранить место, где перенаправление делается, либо изменить unit systemd.
Диагностика (выполните в проблемной сессии):
1) Убедиться, куда сейчас указывает stderr:
readlink /proc/$$/fd/2
2) Проследить цепочку предков и найти, на каком уровне stderr становится /dev/null:
p=$$
while [ "$p" -ne 1 ]; do
echo "PID $p: $(ps -p $p -o cmd=)"
readlink -f /proc/$p/fd/2 2>/dev/null || echo "no fd2"
p=$(ps -p $p -o ppid=)
done
Когда увидите PID, у которого fd/2 == /dev/null, посмотрите, что это за процесс:
ps -p <PID> -o pid,ppid,cmd
и где он был запущен (если systemd):
cat /proc/<PID>/cgroup
# или
systemctl status <имя_сервиса> # если знаете сервис
3) Поиск по конфигам на `exec 2>/dev/null` или аналог:
grep -R --line-number "exec .*2>/dev/null" /etc /root /home 2>/dev/null
Возможные исправления
A) Если это shell‑скрипт (в /etc/profile, /etc/profile.d/*, ~/.bashrc и т.п.) делает exec 2>/dev/null — удалить или изменить эту строку.
B) Если предок — systemd‑сервис, у него в unit указано StandardError=null. Исправить можно через override:
systemctl edit <unit>.service
в появившемся редакторе добавить:
[Service]
StandardOutput=inherit
StandardError=inherit
сохранить, затем:
systemctl daemon-reload
systemctl restart <unit>.service
(вместо inherit можно выбрать journal/tty в зависимости от требуемого поведения; по умолчанию systemd пишет в журнал).
Временное (незавершающееся) исправление для текущей сессии
Если нужно просто вернуть stderr в текущей сессии на терминал:
exec 2>/dev/tty
или (если stdout уже нормален)
exec 2>&1
Проверка
echo "msg on stderr" >&2
Если после этих действий проблема остаётся — пришлите вывод:
- readlink /proc/$$/fd/2
- вывод цикла предков (команда из п.2)
- результат grep по конфигам
С этими данными я подскажу точнее, где именно править.