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
获取所有这些信息

到目前为止,我正在处理的是

  • 电池百分比
  • 蓄电池充电、放电、充电-状态
  • 电池预计充电或放电时间(=剩余时间)
  • 数字1可以通过
    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
    }