尝试为终端 PS1 着色时,换行会出现错误(即使转义非打印字符)

尝试为终端 PS1 着色时,换行会出现错误(即使转义非打印字符)

由于长时间不插上笔记本电脑而导致工作时出现问题,因此我尝试编写一个新的 PS1,使用 upower 显示我当前的电池状态。我快完成了,除了颜色和换行的小错误(或更准确地说,缺少换行,即当到达窗口末尾/没有新行时,字符会打印在同一行的开头),其他一切都运行良好。起初,我以为我犯了一个错误(就像我迄今为止在该主题上看到的所有帖子一样),忘记转义不可打印的字符(使用\[ \]) 但我看不到在哪里...如果没有,PS1 中重叠别名和函数是否存在已知问题(或者有人对我想做的事情有更好的想法)?

这是我的 PS1(“如果有颜色术语”部分):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`battPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ '

以及我的 .bash_aliases 中的 batPer 函数(和别名)(下面的注释):

batPer()
{
 percent=`upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E percentage | cut -d : -f 2 | cut -d " " -f 11 | cut -d % -f 1`
 plugged=`upower -i /org/freedesktop/UPower/devices/line_power_ACAD | grep -E "online: " | cut -d y -f 2` 

if [ "$plugged" = 'es' ] ; then
    echo -e "\[\e[0;92m\]$percent%\[\e[0m\]"
else
  if [ "$percent" -le 10 ]  ; then
     echo -e "\[\e[0;91m\]$percent%"
  else 
     echo -e "\[\e[0m\]$percent%" 
  fi
fi
 }
alias battPer='batPer'

(我取了 line_power_ACAD 的值,因为只要我(拔掉)笔记本电脑,它的状态就会改变 - 我将“yes”中的“y”作为 -f 表示我的 cut,因此测试“es”因为...呃...我很懒;)- 然后我测试:插入 -> 值为绿色,未插入:<10% 所有术语字符为红色,>10% 重置颜色/白色。我在最后使用别名,因为我在尝试将函数本身放入 PS1 时遇到了问题)。

谢谢你们把我从五彩斑斓的噩梦中拯救出来,如果我在混乱中犯了大错误,我很抱歉,我已经看这些线条太久了……

更新:抱歉,我忘记在上次修改后获取 .bashrc 了,我更加迷茫了,当\[\e[0;92m\]$percent%\[\e[0m\]输出如下时: 输出1 当我不放置转义字符时,它就没问题了(百分比为绿色) - 仍然没有换行...我是否在某处逃避了转义字符?!?

答案1

问题在于(强调我的,来自bash 手册,6.9控制提示):

字符串解码后,它通过参数扩展、命令替换、算术扩展和引号删除进行扩展,具体取决于 promptvars shell 选项的值(请参阅Bash 内置函数)。

因此,\[函数输出中的 来得太晚,无法告诉 Bash 后面跟着控制代码。您需要设置PS1函数的输出才能使其工作。我建议使用PROMPT_COMMAND以下方式:

PROMPT_COMMAND='PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`batPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ "'

请注意,内部引号是双引号,因此每次PS1设置时,函数输出都会添加到其中,并且然后Bash 解码PS1以显示提示。

附注:使用这​​个,您不需要输出echo -e。以前,您需要颜色输出,因为 Bash 在扩展字符串后不会解释它PS1。现在,Bash 还会解码控制代码。

相关内容