Решение в стандартном bash:
text='id;some text here with possible ; inside'
text2=${text#*;}
text1=${text%"$text2"}
echo $text1
#=> id;
echo $text2
#=> some text here with possible ; insideDD
Вы можете использовать ddcutil , чтобы проверить, монитор включается, проверяя, установлено ли значение кода VCP 0xd6 в все, кроме 0x05, как указано в таблице 8 -5 VESA Monitor Команда управления Установить:
$ sudo ddcutil -d 1 getvcp d6 |& awk '{ print $NF }'
(sl=0x01)
Это означает, что первый дисплей включен.
$ sudo ddcutil -d 1 getvcp d6 |& awk '{ print $NF }'
(sl=0x05)
Это означает, что первый дисплей выключен.
Самое сложное — сопоставить выходные данные, заданные xrandr, с отображением. идентификатор, который можно использовать с ddcutil. Один из способов, которым я мог подумайте, если нужно извлечь EDID из вывода xrandr, проанализируйте его с помощью edid -декодировать, получить серийный номер и использовать его с ddcutil (, хотя ddcutil принимает --параметр edid, который я не смог использовать для некоторых причина ). В целом, весь сценарий xrandr-turned-on.sh
может выглядеть так:
#!/usr/bin/env sh
if [ ! $# -eq 1 ]
then
printf "Check if monitor represented by xrandr output is turned on.\n
Usage: %s output\n" "$0"
exit 1
fi
for prog in ddcutil edid-decode
do
if ! command -v "$prog" >/dev/null
then
printf "%s not found. Exiting.\n" "$prog" >&2
exit 1
fi
done
set -e
serial="$(xrandr --prop | awk -v output="$1" '$1 ~ output {getline; for (i=1; i<=16; i++) {getline; printf("%s", $1)}}' | edid-decode | grep "Serial number" | cut -d: -f2 | sed "s,^,,")"
state="$(sudo ddcutil -n "$serial" getvcp d6 | awk '{ print $NF }' | cut -d= -f2 | cut -d')' -f1)"
if [ "$state" != "0x05" ]
then
printf "Monitor for output %s turned on\n" "$1"
else
printf "Monitor for output %s turned off\n" "$1"
fi
(Обратите внимание, что использование getline
скорее не рекомендуется в awk-скриптах)
Использование:
$./xrandr-turned-on.sh HDMI3
Monitor for output HDMI3 turned on