Bash 根据电池状态、时间和百分比,在外壳提示中动态使用颜色
我试图创建一个动态提示,使用颜色编码提供电池情况的视觉提示 我将使用Bash 根据电池状态、时间和百分比,在外壳提示中动态使用颜色,bash,macos,awk,terminal,prompt,Bash,Macos,Awk,Terminal,Prompt,我试图创建一个动态提示,使用颜色编码提供电池情况的视觉提示 我将使用pmset-g batt获取所有这些信息 到目前为止,我正在处理的是 电池百分比 蓄电池充电、放电、充电-状态 电池预计充电或放电时间(=剩余时间) 数字1可以通过pmset-g batt | egrep'([0-9]+\%)获取。*'-o--color=auto | cut-f1-d';',结果将是100%(目前,由于我的电池已充满电) 2号可以通过pmset-g batt|awk'/充电|放电|充电/{print$4}'切割
pmset-g batt
获取所有这些信息
到目前为止,我正在处理的是
pmset-g batt | egrep'([0-9]+\%)获取。*'-o--color=auto | cut-f1-d';'代码>,结果将是100%
(目前,由于我的电池已充满电)
2号可以通过pmset-g batt|awk'/充电|放电|充电/{print$4}'切割-f1-d'获取代码>,但要使其在提示中正常工作,必须将其修改为pmset-g batt | awk'/充电|放电|充电/{print$4}'| cut-f2-d''代码>-然后将在单词前显示一个令人尴尬的空白。因此,“充电”
而不是“充电”
,“放电”
而不是“放电”
,“充电”
而不是“充电”
。那很好,我想,但我想这可以再进一步
数字3可以通过pmset-g batt | grep-Eo'([0-9][0-9][0-9]|[0-9]):[0-5][0-9],
-但是,如果你的电池充满电,你会得到一个凉爽的0:00
,这毫无意义
好的,我们已经确定这种信息可以提取出来,并且至少可以在终端本身中显示,那么动态提示问题呢
好吧,这是我现在的情况:
[100%][[收费][11月10日星期六21:24:34][~]>>
这并不完美。例如,[]
根本不需要显示,因为它将显示的信息是0:00
。[charged]
也有点不必要
下面是我想问的问题:
当电池充满时,只需显示百分比,没有“[剩余时间/充电时间]
”和“[充电]
当电池放电时,显示百分比和“[剩余时间]
(百分比颜色可以修改?)
电池充电时,显示百分比和“[剩余时间]
(百分比可能为黄色)
当电池处于临界状态时(比如15%)(百分比可能为红色)
现在,我做到了这一点:
export PS1=“[\$(pmset-g batt|egrep'([0-9]+\%).'-o-color=auto | cut-f1-d')][\$(pmset-g batt | grep-Eo'([0-9][0-9].[0-5][0-9])][\$(pmset-g batt | awk'/充电|放电|充电|打印$4';充电|切割| f2 d'.]
这给了我[100%][0:00][charged][11月10日星期六21:32:38]
无论如何,回到那个奇怪的cut-f1
与cut-f2
终端和提示符之间的区别。如果我将cut-f1
放入export PS1
提示符中,我会得到以下结果:
[100%][0:00][-InternalBattery-0(id=4194403)100%][11月10日星期六21:34:44]
不管怎么说,我想一定有办法“哦,0:00?根本不显示提示的这一部分”-但我不知道该怎么做
所以,总而言之,我尝试使用“充电、充电、放电”来设置电池百分比颜色,充电=常规颜色,充电=黄色,放电=绿色,小于20%=恐慌红色。5%闪烁?:D
我还尝试动态地在提示符中显示“剩余充电时间”和“剩余充电时间”
任何建议都将不胜感激
p、 如果充电剩余时间pmset-g batt
导致(无估计值)
,则显示[估计值]的额外加分
p、 p.s.额外加分#2,用于确定如何处理(即,这种状态不是(无估计值)
,但有时会发生
现在使用“交流电源”
-内部电池-0(id=4194403)89%;已连接交流;未充电:正确
您的问题实际上是关于如何处理复杂提示。这里真正复杂的问题是如何处理在提示中有条件地使用ANSI颜色。
子问题是“普通”字符串咬合、条件和ANSI代码。所有这些我都在profile
和functions\u colors.sh
中处理
你真正想要的是
export PS1="[\$(__batt_pct)]\$(__batt_time) [\$(__batt_state)] [\d \t] "
然后
yellow=$(tput setaf 184)
green=$(tput setaf 120)
red=$(tput setaf 160)
reset=$(tput init)
function __batt_pct() {
bpct=$(pmset -g batt | egrep '([0-9]+)%.*' -o | cut -f1 -d';')
bpct=${bpct%?} # remove last char (%)
case 1 in
$(($bpct <= 15))) echo "$red$bpct%$reset" ;;
$(($bpct <= 65))) echo "$yellow$bpct%$reset" ;;
*) echo "$green$bpct%$reset" ;;
esac
}
# now, as a function, we can easily handle a conditional
function __batt_time() {
btime=$(pmset -g batt | grep -Eo '([0-9][0-9]|[0-9]):[0-5][0-9]')
if [[ "$btime" == "0:00" ]]; then echo ''; else echo " [$btime]"; fi
}
# I need to cut field-1 for this to trim evenly
function __batt_state() {
bstate=$(pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f1 -d';')
}
,以便我可以更轻松地使用。根据您的问题,您似乎已经在动态提取电池信息。您的问题是关于使0:00
消失,还是其他问题,还是一组小问题?一组小问题。1:如果没有显示,如何隐藏0:00 2:如何使用充电+充电ng+已放电用于更改电池百分比的颜色,3:如何显示剩余充电时间和剩余充电时间,0:00为突出显示的颜色。这将使其成为一个非常紧凑的解决方案-您可以一眼看到剩余的时间以及您是充电还是放电4:设置““任何低于25%到红色的内容”例如。这种颜色+数据读取逻辑。@NewAlexandria嗨,我已将问题改写为更精确,这应该是可以理解的。如果缺少一些内容,请让我知道,我将尝试更好地澄清。嗨,谢谢你的澄清。我尝试了你发送的内容,并得到以下结果:[100%][8:10][\033[31mdischarging\033[00m][Fri Nov 09 21:16:21][~]>>所以不确定这里发生了什么:)只是ANSI代码的回音方式。我将在稍后查看更正确的解决方案。请注意,(e)grep
的--color=auto
选项是无用的,因为它的输出将传输到管道
# I need to cut field-1 for this to trim evenly
function __batt_state() {
bstate=$(pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f1 -d';')
case "$bstate" in
charged)
echo "$green$bstate$reset"
;;
charging)
echo "$yellow$bstate$reset"
;;
discharging)
echo "$red$bstate$reset"
;;
*)
echo $bstate
exit
esac
}