Право собственности, диски и разрешения

Единственное, что я думаю сделать с этим сценарием (, который я не тестировал, поскольку я не работаю в системе 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не изменяется между итерациями.

0
18.07.2021, 21:29
0 ответов

Теги

Похожие вопросы