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

在msys bash上包含换行符时,PS1命令替换失败,bash,backticks,ps1,command-substitution,Bash,Backticks,Ps1,Command Substitution,此命令成功 $ PS1='$(date +%s) $ ' 1391380852 $ $PS1='$(日期+%s)$' 1391380852 $ 但是,如果我添加一个换行符,它将失败 $ PS1='$(date +%s)\n$ ' bash: command substitution: line 1: syntax error near unexpected token `)' bash: command substitution: line 1: `date +%s)' $PS1='$(日期+%

此命令成功

$ PS1='$(date +%s) $ ' 1391380852 $ $PS1='$(日期+%s)$' 1391380852 $ 但是,如果我添加一个换行符,它将失败

$ PS1='$(date +%s)\n$ ' bash: command substitution: line 1: syntax error near unexpected token `)' bash: command substitution: line 1: `date +%s)' $PS1='$(日期+%s)\n$' bash:命令替换:第1行:意外标记“)”附近的语法错误 bash:命令替换:第1行:`date+%s)' 如果我使用backticks,它会工作

$ PS1='`date +%s`\n$ ' 1391381008 $ $PS1=''date+%s`\n$' 1391381008 $ 但是。那么是什么导致了这个错误呢

GNU bash, version 4.2.45(6)-release GNUBash,版本4.2.45(6)-发布
您可以很容易地消除解析的歧义,以防止碰到任何此类错误(尽管我自己无法复制):

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


有关
$'
'
(展开反斜杠转义序列)的区别的更多信息,请参阅。

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

顺便说一句,Linux上的一切都很好

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

旧的、有问题的PS1:

固定的:

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


为找到问题干杯

这对我来说很好。您使用的bash版本是什么?我已经安装了
GNU bash,版本4.2.45(2)-发行版
。即使使用bash 3和KSH(除了使用KSH的
\n
),它也对我有用。4.2.45(6)的任何特定供应商包,或者这个股票是上游的?很难想象,右括号后面的哪个字符会导致该括号被视为被替换命令的文字部分,而不是命令替换的结束标记。解析必须是复杂的,在流中向后跳跃,或者奇怪的lookaheads。@Kaz,
是不同的标记,因此一定量的先行是必需的。是的,这是一个很有趣的问题——它依赖于平台,这使得它更具吸引力。在我使用MSYS2编译的bash
(GNU bash,版本4.2.45(6)-发行版(x86_64-pc-msys)
)的情况下出现了问题。谢谢。好的,我用双引号解决了它。
“bla\n bla”
变成了
“bla”$”\n“bla”
。通过良好的尝试和错误解决了问题,并阅读了关于Bash逃跑的文章…@oligofren,…需要记住的一件事是,shell不需要一个单词以相同的方式引用相同的引用样式;例如,您可以执行
literal“double-quoted”'single-quoted'
来生成单个单词,其中的不同部分在解析时用三种不同的引用类型处理。这正是我在回答中所做的,切换到
$'
引用类型以插入文字换行符。@oligofren,它是一种不同的引用形式,导致对事物进行不同的分析
$'\n'
解析为一个字符的文字换行符,而
'\n'
解析为两个字符的序列,一个文字反斜杠后跟一个文字
n
。谢谢您--希望现在应用的编辑得到您的批准。
PS1='$(date +%s)'$'\n$ '
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$ '