モニターが接続されたら、ビデオとサウンド出力を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
これにより、複数行のコードを更新することを忘れずに、1つの場所でxrandr
呼び出しパラメータを変更できます。pactl
スクリプトはbash
シェル固有の機能を使用しないため、シェルもに変更しました。シェル実行可能ファイルを明示的にポイントしたい場合があります/bin/sh
。bash
dash
呼び出しgrep
は出力を生成しないように変更されたため()-q
正規表現の一致()ではなく文字列比較を実行します-F
。コマンドラインの次の項目は検索モードです-e
。パターンの最初の項目が変数拡張の場合、通常はうまく機能します。で始まる値は、ユーティリティを混同する可能性があるためです。grep
-e
-
電話番号xrandr
も確認しました。pactl
いいえprofile
繰り返し間で変数の値が変更されていない場合に実行されます。