有没有办法优化我的守护进程?

有没有办法优化我的守护进程?

我编写了这个 shell 脚本,一旦连接显示器,它就会将我的视频和声音输出更改为 hdmi。我通过 systemd 激活它。

#!/bin/bash
intern=eDP1
extern=DP1

while true; do
    if xrandr | grep "$extern disconnected"; then
        xrandr --output "$extern" --off --output "$intern" --auto
        pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
    else
        xrandr --output "$intern" --off --output "$extern" --auto
        pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
    fi
    sleep 1;
done

一切都按预期进行。您对如何优化我的代码有什么建议吗?

答案1

除了每秒运行一次(听起来像矫枉过正),就是应用干燥原则到它。这意味着重构它,以便它仅在循环中的单个位置调用xrandr和(测试中的额外调用除外):pactlxrandr

#!/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特定于 的功能,因此我还将 shell 更改为/bin/sh可能比bash.您可能希望将其dash明确指向 shell 可执行文件。

grep调用以不产生任何输出 ( ) 的方式进行固定-q,因此它执行字符串比较而不是正则表达式匹配 ( -F)。告诉-e我们grep命令行上的下一件事是搜索模式。-e如果模式中的第一件事是变量扩展,那么通常很好用,因为以 a 开头的值-可能会使实用程序感到困惑。

我还确保了xrandrpactl电话不是如果变量的值profile在迭代之间没有改变,则执行。

相关内容