【问题标题】:Why does adding \n at the end of my PS1 lead to substitution errors?为什么在我的 PS1 末尾添加 \n 会导致替换错误?
【发布时间】:2019-07-26 07:06:55
【问题描述】:

所以,我在 Windows 上使用我的 PS1 来玩 Git bash。

我的PS1 看起来像这样:

PS1="\n\[\033[01;35m\]\u@\h\[\033[01;34m\] $PWD \[\033[00m\]\[\033[01;32m\]$(__git_ps1 "(%s)")\[\033[00m\]\nλ "

然后我注意到更改分支时分支名称没有更新,并找到this answer,它告诉我将双引号换成单引号。

现在,我的PS1 看起来像这样:

PS1='\n\[\033[01;35m\]\u@\h\[\033[01;34m\] $PWD \[\033[00m\]\[\033[01;32m\]$(__git_ps1 "(%s)")\[\033[00m\]\nλ '

突然,我在执行 .bashrc 时收到警告:

bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: `__git_ps1 "(%s)")'

进一步调查显示,当我在 λ 定义末尾的 λ 之前删除 \n 时,警告消失了。

谁能回答我:

  • 究竟是什么导致了这个警告(对我来说,最后的\n 似乎与__git_ps1 的执行完全无关)?
  • 我需要更改哪些内容才能删除警告?

编辑

当我将 $(__git_ps1 "(%s)") 更改为 `__git_ps1 "(%s)"` 时,警告消失了,一切都按预期工作......

【问题讨论】:

  • 我怀疑提示中的非打印字符有问题需要转义,以便提示可以正确说明终端中的长度。请参阅2.5. Bash Prompt Escape Sequences(最后 2 个)。我知道有更好的提示教程可以更好地解释这一点。你可以搜索"bash prompt escape non-printing characters",看看能不能找到详细的解释。如果提示没有正确考虑其长度,则会发生各种奇怪的事情。

标签: bash git-bash ps1


【解决方案1】:

解决方案

NEWLINE="
"
PS1='\[\033[01;35m\]\u@\h \[\033[01;34m\]$PWD\[\033[01;32m\]$(__git_ps1)\[\033[00m\]$NEWLINEλ '

换行存在问题,重置颜色也使行变长。

最小的问题样本:

PS1='$(date)\n$'

看起来像是变量替换的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多