在msys bash上包含换行符时,PS1命令替换失败

时间:2014-02-02 22:46:59

标签: bash backticks ps1 command-substitution

此命令成功

$ PS1='$(date +%s) $ '
1391380852 $

但是,如果我添加新行,则无法

$ PS1='$(date +%s)\n$ '
bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: `date +%s)'

如果我使用反引号就行了

$ PS1='`date +%s`\n$ '
1391381008
$

但是backticks are discouraged。那是什么导致了这个错误?

GNU bash, version 4.2.45(6)-release

2 个答案:

答案 0 :(得分:19)

您可以轻松消除解析歧义,以防止遇到任何此类错误(尽管我自己无法重现):

PS1='$(date +%s)'$'\n$ '

$'\n'语法解析为文字换行符,而'\n'解析为包含两个字符\n转义序列的字符串。

有关$''''的区别(扩展反斜杠转义序列)的详细信息,请参阅Bash Hackers Wiki

答案 1 :(得分:1)

当我尝试将其包含在Windows上的bash(MSYS2)上的PS1中时,我遇到了与.git-prompt类似的问题。问题是\n,如果我删除它,一切运行顺利,但我想断线。

顺便说一句,在Linux上一切正常。

bash运行的是:4.3.42(5)-release (x86_64-pc-msys)

旧的,有问题的PS1:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")\nλ \e[0m\]$(tput sgr0)'

修正:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")'$'\nλ \e[0m\]'

简化版(无颜色,复制粘贴 - 编辑):

PS1='\u@\h \w $(__git_ps1 "(%s)")'$'\n$ '

干杯Charles Duffy发现问题!