모니터가 연결되면 비디오 및 사운드 출력을 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
쉘 특정 기능을 사용하지 않으므로 쉘도 으로 변경했습니다 . 쉘 실행 파일을 명시적 으로 가리키고 싶을 수도 있습니다 /bin/sh
.bash
dash
호출 grep
은 출력을 생성하지 않는 방식으로 수정되었으므로( ) -q
정규식 일치( ) 대신 문자열 비교를 수행합니다 -F
. 명령줄의 다음 항목은 검색 모드 입니다 -e
. 패턴의 첫 번째 항목이 변수 확장인 경우 일반적으로 잘 작동합니다. 로 시작하는 값은 유틸리티를 혼동할 수 있기 때문입니다.grep
-e
-
전화번호 xrandr
도 확인했어요pactl
아니요profile
반복 간에 변수 값이 변경되지 않은 경우 실행됩니다.