我编写了这个 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
和(测试中的额外调用除外):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
特定于 的功能,因此我还将 shell 更改为/bin/sh
可能比bash
.您可能希望将其dash
明确指向 shell 可执行文件。
该grep
调用以不产生任何输出 ( ) 的方式进行固定-q
,因此它执行字符串比较而不是正则表达式匹配 ( -F
)。告诉-e
我们grep
命令行上的下一件事是搜索模式。-e
如果模式中的第一件事是变量扩展,那么通常很好用,因为以 a 开头的值-
可能会使实用程序感到困惑。
我还确保了xrandr
和pactl
电话不是如果变量的值profile
在迭代之间没有改变,则执行。