![尝试为终端 PS1 着色时,换行会出现错误(即使转义非打印字符)](https://linux22.com/image/1154425/%E5%B0%9D%E8%AF%95%E4%B8%BA%E7%BB%88%E7%AB%AF%20PS1%20%E7%9D%80%E8%89%B2%E6%97%B6%EF%BC%8C%E6%8D%A2%E8%A1%8C%E4%BC%9A%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%EF%BC%88%E5%8D%B3%E4%BD%BF%E8%BD%AC%E4%B9%89%E9%9D%9E%E6%89%93%E5%8D%B0%E5%AD%97%E7%AC%A6%EF%BC%89.png)
由于长时间不插上笔记本电脑而导致工作时出现问题,因此我尝试编写一个新的 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
问题在于(强调我的,来自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 还会解码控制代码。