我试图做出一个显示当前电池百分比的提示,但是如果我有PS1
按照.bashrc
编写方式进行设置的代码,那么它只会在打开终端的新实例时初始化交互式 shell 时检查数据一次模拟器。.bashrc
如果我想要更新数据,这需要我重新加载。我对类 Unix 操作系统还很陌生,所以我可能甚至很可能遗漏了一些微不足道的东西。也许我应该创建一个守护程序来更新提示?
这不是我的提示的完整代码,但它是与更改数据相关的位。
PS1="`upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}'`$ "
答案1
我不知道主动更新该值的好方法,但是只要 shell 有活动(例如,当您按 Enter 时),您就可以使用以下命令更新它PROMPT_COMMAND
:
update_ps1() {
PS1="$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}')$ "
}
PROMPT_COMMAND=update_ps1
这样,我添加了一个名为 bash 的函数update_ps1
,该函数在执行时将更新PS1
变量。接下来,我将PROMPT_COMMAND
变量设置为该函数的名称。根据man bash
:
PROMPT_COMMAND If set, the value is executed as a command prior to issuing each primary prompt.
这样,每次 bash 写入提示时,它都会执行 的值PROMPT_COMMAND
,这会PS1
在 bash 写入之前更新该值,因此它将在写入时具有最新值。
答案2
你不需要upower
。所有 Shell 都支持循环,因此您可以执行以下操作:
#!/bin/sh
# Loop trough all batteries
for battery in /sys/class/power_supply/BAT?
do
# Get capacity of battery
capacity=$(cat "$battery"/capacity) || exit
# Get status of battery
status=$(cat "$battery"/status)
# Print capacity and status
echo "$capacity" \| "$status"
done
说明:您的电池信息存储在/sys/class/power_supply/
单独的电池中,并命名BAT
为一些编号,即BAT0, BAT1, ...
。由于 Linux 上的所有内容都是一个文件,因此您可以简单地找出其中的内容BAT0/status
并BAT0/capacity
获取所需的信息,然后使用echo
.如果您还有其他问题请询问!