배터리 잔량을 확인하고 5% 미만이면 사용자에게 알리는 스크립트를 작성했습니다.
스크립트는 각 검사 후 1분 동안 휴면 상태로 유지됩니다.
다음과 같이 스크립트를 작성하면 CPU 작업 부하가 크게 증가합니다.
#!/bin/sh
while true; do
[[
$(
upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
grep percentage |
grep -Poe "\d*"
) -lt 5
]] &&
notify-send "Battery below 5%" &&
sleep 60
done
CPU 자원이 많이 사용되고 있는 것을 이미지에서 볼 수 있습니다. 삭제되지 않습니다.
간단한 if/else 블록을 사용하여 보다 전통적인 방식으로 스크립트를 작성하면 모든 것이 예상대로 작동하고 CPU는 절전 기간이 끝난 후 시작 부분에만 잠깐 동안만 증가합니다.
while true; do
if [[
$(
upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
grep percentage |
grep -Poe "\d*"
) -lt 5
]]; then
notify-send "Battery below 5%"
else
sleep 60
fi
done
왜 이런 동작이 발생하는지 아시나요?
답변1
첫 번째 버전에서는 notify-send
테스트가 참이고 호출이 성공한 경우에만 잠을 자고 테스트가 거짓인 경우에는 잠을 자지 않았습니다. 두 번째 버전에서는 테스트가 false인 지점에서만 잠을 자고 있습니다 notify-send
.아니요부르다. 이는 후자 버전의 배터리가 부족해지면 동일한 문제에 직면하게 된다는 것을 의미합니다.
테스트 결과에 관계없이 두 경우 모두 스크립트를 절전 모드로 전환해야 합니다. 최소한 첫 번째 버전에서는 after를 변경하여 &&
두 명령 간의 관계를 끊습니다. 그러나 나는 - 문을 다음과 같이 철자하겠습니다.notify-send
;
if
#!/bin/sh
while true; do
pct=$(
upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
grep percentage |
grep -Poe "\d*"
)
if [ "$pct" -lt 5 ]; then
notify-send "Battery below 5%"
fi
sleep 60
done
( [[ .. ]]
조건부는 표준 기능이 아니며 sh
다양한 시스템에 설치된 모든 쉘이 이를 지원하는 것은 아닙니다.)