我编写了一个脚本来检查电池电量,如果电量低于 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
调用成功时,您才会休眠;但如果测试是假的则不然。在第二个版本中,您只在测试为假的分支中睡觉,并且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
各种系统中安装的所有 shell 都支持它。)