Единственное, что я думаю сделать с этим сценарием (, который я не тестировал, поскольку я не работаю в системе Unix с X, и у меня нет монитора HDMI ), кроме его запуска каждую секунду (, что звучит как излишество ), заключается в применении к ней принципа DRY . Это означало бы рефакторинг, чтобы он вызывал только xrandr
и pactl
в одном месте цикла (, за исключением дополнительного вызова xrandr
в тесте ):
.
#!/bin/sh
intern=eDP1
extern=DP1
while true; do
if xrandr | grep -q -F -e "$extern disconnected"; then
output_on=$intern
output_off=$extern
profile=analog
else
output_on=$extern
output_off=$intern
profile=hdmi
fi
if [ "$previous_profile" != "$profile" ]; then
xrandr --output "$output_off" --off \
--output "$output_on" --auto
pactl set-card-profile 0 "output:$profile-stereo+input:analog-stereo"
previous_profile=$profile
fi
sleep 1
done
Таким образом, вам нужно только изменить параметры вызовов xrandr
и pactl
в одном месте, и вам не нужно помнить об обновлении нескольких строк кода.
Поскольку скрипт не использует никакихbash
-специфических функций, я также изменил оболочку на /bin/sh
, которая может быть более легкой -по весу, чем bash
.Вы можете явно указать его на исполняемый файл оболочки dash
.
Вызов grep
исправлен таким образом, что он не производит никаких выходных данных(-q
)и так что он выполняет сравнение строк, а не сопоставление с регулярным выражением(-F
). -e
сообщает grep
, что следующее в командной строке — шаблон поиска. Как правило, хорошо использовать -e
, если первая вещь в шаблоне — расширение переменной, так как значение, начинающееся с -
, может запутать утилиту.
Я также убедился, что вызовы xrandr
и pactl
выполняются а не , если значение переменной profile
не изменяется между итерациями.