Как получить и использовать разрешение экрана в Linux
Быстрые ссылки
- Зачем менять разрешение экрана
- Использование команды xrandr
- Использование команды xdpyinfo
- Включение в скрипт
- Разделение X и Y разрешений
- Держите всё просто
Краткое содержание
- Для получения и установки разрешения экрана используйте xrandr; для подробной информации — xdpyinfo.
- Примеры show, как извлечь значение разрешения через awk:
xrandr | awk -F'[ +]' '/primary/{print $4}'иxdpyinfo | awk '/dimensions/ {print $2}'. - В скриптах результат можно поместить в переменную и при необходимости разделить на ширину (X) и высоту (Y).
Зачем менять разрешение экрана
Иногда скрипт должен знать текущее разрешение — чтобы:
- Передать параметры в графическое приложение при запуске.
- Убедиться, что изменение разрешения прошло успешно.
- Подстроить поведение программы под устройство с ограниченными ресурсами (например, запуск игр в пониженном разрешении на старом железе).
Ручная смена разрешения утомительна; автоматизация через скрипт делает процесс повторяемым и переносимым. Команды, описанные ниже, входят в состав большинства дистрибутивов Linux и не требуют дополнительной установки на системах с X11.
Важно: современные дистрибутивы могут по умолчанию использовать Wayland вместо Xorg. В таких случаях xrandr/xdpyinfo могут быть недоступны или работать неправильно — см. раздел «Альтернативы и совместимость».
Использование команды xrandr
Команда xrandr может как установить, так и запросить текущие видеорежимы. Без параметров она выводит список поддерживаемых режимов:
xrandr
В выводе предпочтительные режимы помечаются знаком «+», а текущий режим — звёздочкой «». Если у монитора несколько режимов с «+», текущим будет лишь один с «». Вместо парсинга всей части вывода через grep/sed, проще извлечь строку, где упоминается «connected primary», — в ней уже содержится текущая информация.
Простой и компактный вариант через awk:
xrandr | awk -F'[ +]' '/primary/{print $4}'Как это работает:
-F'[ +]'задаёт разделители полей: пробел и символ+./primary/отбирает линию, где встречается слово primary (обычно строка с информацией о подключённом основном экране).{print $4}выводит четвёртое поле — там обычно находится строка вида1920x1080.
Этот подход уменьшает зависимость от дополнительных вызовов (grep/sed) и работает быстро в скриптах.
Пример использования для установки режима (опционально):
# Найти режим и установить его (если нужно) — пример, требует существующего режима
MODE=$(xrandr | awk -F'[ +]' '/primary/{print $4}')
# Расшифровка и установка происходят отдельными шагами в зависимости от задачиИспользование команды xdpyinfo
Команда xdpyinfo выдаёт подробную информацию о X-сервере и экране. Её вывод длинный, но содержит явную строку с ключевым словом “dimensions”.
xdpyinfo
Чтобы получить только строку с текущим разрешением:
xdpyinfo | awk '/dimensions/ {print $2}'Здесь awk по умолчанию использует пробелы в качестве разделителя, а поле $2 содержит значение вида 1920x1080.
Преимущество xdpyinfo — более прямое нахождение поля с помощью стандартного разделителя, но сама команда может выводить гораздо больше информации, поэтому её лучше использовать при необходимости дополнительных деталей.
Включение в скрипт
Чтобы поместить получение разрешения в скрипт Bash, достаточно присвоить вывод команды переменной. Сохраните в файл get_res.sh:
#!/bin/bash
current_res=$(xdpyinfo | awk '/dimensions/ {print $2}')
echo $current_resСделайте файл исполняемым:
chmod +x get_res.shЗапуск:
./get_res.shВы увидите разрешение в формате ШИРИНAxВЫСОТА.
Разделение X и Y в скрипте
Чтобы получить отдельно ширину и высоту, используйте дополнительный разбор строки:
#!/bin/bash
current_res=$(xdpyinfo | awk '/dimensions/ {print $2}')
current_x=$(echo $current_res | awk -F'[ x]' '{print $1}')
current_y=$(echo $current_res | awk -F'[ x]' '{print $2}')
echo "full: $current_res"
echo "width: $current_x"
echo "height: $current_y"Затем: chmod +x get_x_y.sh и ./get_x_y.sh.
Почему мы используем -F'[ x]'? Потому что разделителем может выступать символ x, возможно окружённый пробелами (иногда вывод содержит 1920 x 1080). Это делает парсинг устойчивее.
Когда метод может не сработать
- Wayland: многие современные окружения (например, Fedora с Gnome) по умолчанию используют Wayland; xrandr и xdpyinfo относятся к X11 и могут быть недоступны.
- Несколько мониторов: если активен не-primary монитор или вы используете несколько экранов, поиск только по
primaryвернёт параметры только основного дисплея. - Нет прав на X-сервер: запуск скрипта от удалённого пользователя без перенаправления DISPLAY или без Xauthority не даст результата.
- Неоднородный вывод: некоторые дисплеи/драйверы могут выводить нестандартные строки, поэтому разбор может дать неверный результат.
Важно: не полагайтесь только на один метод во всех окружениях — добавьте проверки и альтернативы.
Альтернативы и совместимость
Wayland
- Инструменты для Wayland другие: sway, wlroots, weston и специфичные утилиты вроде
wlr-randr/wayland-info. Для Gnome на Wayland можно использовать GSettings или DBus вызовы. - Если система использует Wayland, xrandr/xdpyinfo часто либо не показывают корректные данные, либо сообщают ошибку.
- Инструменты для Wayland другие: sway, wlroots, weston и специфичные утилиты вроде
wmctrl / xwininfo
- Эти утилиты помогают получить информацию о окнах и мониторах, но не всегда удобны для одного общего разрешения.
Display Managers и DE API
- Многие окружения рабочего стола (GNOME, KDE) предлагают собственные API/инструменты для управления выводом и разрешением. В некоторых случаях лучше использовать их через DBus или соответствующие утилиты.
Совет: в скрипте сперва попытайтесь получить данные через xdpyinfo/xrandr, затем — при ошибке — попробовать Wayland-ориентированные утилиты или DE-API.
Мини‑методика: встроить в надёжный скрипт (шаги)
- Проверить переменную окружения DISPLAY — если она не задана, попытайтесь её установить или завершите с понятной ошибкой.
- Попытаться получить разрешение через xdpyinfo. Если успех — обработать результат.
- Если xdpyinfo не доступен, попытаться xrandr.
- В случае ошибок — логировать причину и, при возможности, попытаться Wayland-утилитами.
- Валидация: проверить, что полученное значение соответствует формату
числоxчисло. - Разделить на current_x, current_y и использовать как входные параметры для дальнейших шагов.
Пример псевдо-алгоритма в Bash:
# проверка DISPLAY
if [ -z "$DISPLAY" ]; then
echo "DISPLAY не задан; невозможно получить разрешение" >&2
exit 1
fi
# попытка через xdpyinfo
if command -v xdpyinfo >/dev/null 2>&1; then
res=$(xdpyinfo | awk '/dimensions/ {print $2}')
fi
# fallback на xrandr
if [ -z "$res" ] && command -v xrandr >/dev/null 2>&1; then
res=$(xrandr | awk -F'[ +]' '/primary/{print $4}')
fi
# валидация
if [[ $res =~ ^[0-9]+x[0-9]+$ ]]; then
: # всё хорошо
else
echo "Не удалось распознать разрешение: $res" >&2
exit 2
fiЧек‑листы по ролям
Для разработчика приложений GUI:
- Убедиться, что скрипт реагирует на состояние нескольких мониторов.
- Предусмотреть переключение между X11 и Wayland.
- Логировать ошибочные значения и fallback-пути.
Для игрока/пользователя, собирающего автоматическую смену режима:
- Создать простую оболочку с меню выбора требуемого разрешения.
- Сохранять текущий режим и давать возможность возврата.
- Тестировать режимы перед применением в играх.
Для системного администратора:
- Включить проверку DISPLAY и прав доступа к X-серверу.
- Автоматизировать проверку драйверов и профилей мониторов.
- Включить уведомления при неудачных попытках изменить разрешение.
Тесты и критерии приёмки
Критерии приёмки:
- Скрипт корректно извлекает разрешение в формате
WxHна X11. - Скрипт корректно разбивает значение на width/height и эти переменные доступны для дальнейших действий.
- При отсутствии X11 скрипт возвращает понятную ошибку или использует альтернативу (Wayland), если это предусмотрено.
Минимальные тесты:
- В среде X11: проверка с одним монитором.
- В среде X11: проверка с несколькими мониторами (primary и non-primary).
- В среде Wayland: ожидаемый отказ или альтернативный путь.
- Отсутствие DISPLAY: фиксированное поведение.
Диагностика и восстановление (runbook)
Симптом: скрипт возвращает пустую строку.
- Проверьте DISPLAY:
echo $DISPLAY. - Проверьте доступность утилит:
which xdpyinfo xrandr. - Посмотрите вывод
xdpyinfo/xrandrвручную.
- Проверьте DISPLAY:
Симптом: получено неверное значение (не числовое).
- Проверьте локаль и символы-разделители в выводе.
- Попробуйте отладочные выводы:
set -xв скрипте.
Откат: если изменение разрешения ломает рабочий процесс, верните сохранённый режим через xrandr или DE-инструменты. Всегда сохраняйте «старый» режим перед изменением.
Примеры использования: сценарии
- Автоматический запуск игры: проверять current_x >= 1280 до запуска в оконном режиме.
- Скриншот‑утилита: подстраивать команду захвата по высоте и ширине монитора.
- Удалённая настройка рабочих мест: скрипт проверяет разрешение и устанавливает политики масштабирования.
Ментальные модели и эвристики
- «Первое — проверить DISPLAY»: без корректного DISPLAY любые GUI-операции бессмысленны.
- «Fallback сверху вниз»: сначала использовать наиболее точный инструмент (xdpyinfo), затем — более общий (xrandr), затем — альтернативы для Wayland.
- «Не доверяй вводу — проверяй формат»: всегда валидируйте
WxHперед использованием.
Совместимость и переходы (советы по миграции)
- Для новых систем с Wayland планируйте использование Wayland-совместимых инструментов или DE-API.
- Для скриптов, ориентированных на серверные окружения, проверяйте наличие Xvfb (виртуальный фреймбуфер) для эмуляции X-сессии.
- Документируйте предпосылки: какая сессия ожидается (X11/Wayland), нужна ли авторизация к X-серверу.
Примеры шаблонов и сниппеты
Шаблон вывода разрешения с fallback:
# Получение разрешения (удобный шаблон)
get_resolution() {
if command -v xdpyinfo >/dev/null 2>&1; then
xdpyinfo | awk '/dimensions/ {print $2; exit}'
elif command -v xrandr >/dev/null 2>&1; then
xrandr | awk -F'[ +]' '/primary/{print $4; exit}'
else
return 1
fi
}Использование:
res=$(get_resolution) || { echo "Не удалось получить разрешение"; exit 1; }Диаграмма принятия решения
flowchart TD
A[Есть DISPLAY?] -->|Нет| B[Выдать ошибку и выйти]
A -->|Да| C[Есть xdpyinfo?]
C -->|Да| D[Получить res через xdpyinfo]
C -->|Нет| E[Есть xrandr?]
E -->|Да| F[Получить res через xrandr]
E -->|Нет| G[Попытаться Wayland-утилиты]
D --> H{Валидно WxH?}
F --> H
G --> H
H -->|Да| I[Разбить на X и Y и продолжить]
H -->|Нет| BПрактические советы и подводные камни
- Всегда проверяйте права доступа к X-серверу при запуске из сервиса/cron — у таких процессов обычно нет доступа к сессии пользователя.
- Для сценариев с несколькими мониторами уточняйте, нужен ли вам primary или конкретный дисплей.
- Чтобы избежать временных артефактов, сохраняйте текущее разрешение перед изменением и возвращайте его при завершении.
Итоги
Знать текущее разрешение экрана полезно для автоматизации запуска графических приложений и адаптации поведения скриптов под конкретное устройство. На X11 компактные и надёжные инструменты — xdpyinfo и xrandr — позволяют извлечь нужные значения через простые awk-выражения и использовать их в Bash-скриптах. Планируйте проверку окружения (X11 vs Wayland), добавляйте fallback-пути и валидацию, чтобы обеспечить переносимость и устойчивость ваших сценариев.
Важно
- Если ваша система использует Wayland, изучите соответствующие инструменты для Wayland или DE-API для получения разрешения экрана.
Краткий чек‑лист
- Проверить DISPLAY
- Попытаться xdpyinfo
- Фоллбек на xrandr
- Валидировать
WxH - Разбить на width/height
- Использовать значения в логике скрипта
Похожие материалы
Spotify не может воспроизвести трек — способы исправить
Установка Google Play на Windows 11
AirDrop на Apple: настройка и безопасность
Уведомления об истечении пароля в Active Directory
Задержка в Routines Google Assistant