xrandr -q
дает мне список подключенных дисплеев, но как я могу узнать (с учетом сценариев), активен ли дисплей в настоящее время?
Контекст: я хотел бы написать скрипт для переключения дисплея. Если он активен, его следует отключить, если нет - включить.
Примечание: xrandr -q
в основном предоставляет эту информацию, поскольку активные режимы помечены *
, но эту информацию трудно извлечь в скрипте bash.
Подключите весь дисплей, используя
xrandr -q
. Затем вы можете создать переменную для всех подключенных дисплеев, например
Display1=VGA1
и т. Д.
, затем использовать скрипт
#!/bin/bash
if (xrandr | grep "$DISPLAY1 connected"); then
if (ls | grep status_flag); then
xrandr --output $DISPLAY1 --off
rm status_flag
else
xrandr --output $DISPLAY1 --auto
touch status_flag
fi
fi
При первом выполнении этого сценария монитор включается, не зная, включен или выключен монитор, и со второго раза он выключится, если монитор включен, и включится, если монитор выключен.
с xrandr в списке разрешений, активное разрешение дисплея должно иметь звездочку сразу после него, если оно отсутствует, то дисплей не активен.
Активные дисплеи имеют разрешение и номер смещения, показанные в идентификационной строке на выходе xrandr
. Вот что я имею в виду:
$ xrandr | grep connected
eDP1 connected primary 1366x768+1280+256 (normal left inverted right x axis y axis) 345mm x 194mm
DP1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 340mm x 270mm
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
В выходных данных вы видите, что встроенный монитор моего ноутбука и VGA1 оба подключены и имеют разрешение (в случае встроенного дисплея eDP1 это 1366x768). Таким образом, задача просто превращается в обработку текста. Для этой цели я написал небольшую функцию, которую вы можете использовать в своих скриптах или ~/.bashrc
:
get_active_monitors()
{
xrandr | awk '/\ connected/ && /[[:digit:]]x[[:digit:]].*+/{print $1}'
}
Вот тестовые прогоны:
С VGA-монитором на
С выключенным монитором VGA
if (command | pipe); then ...
, то команда будет выполняться в подоболочке. Необходимо просто отбросить скобки.if command | pipe ;then ...
– user462990 07.05.2020, 22:40