18

此命令成功

$ PS1='$(日期+%s)$'
1391380852 $

但是,如果我添加换行符,它会失败

$ PS1='$(日期+%s)\n$'
bash:命令替换:第 1 行:意外标记 `)' 附近的语法错误
bash:命令替换:第 1 行:`date +%s)'

如果我使用反引号,它会起作用

$ PS1='`日期+%s`\n$'
1391381008
$

不鼓励使用反引号。那么是什么导致了这个错误呢?

GNU bash,版本 4.2.45(6)-发布
4

3 回答 3

25

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

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

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

有关与(扩展反斜杠转义序列)有何$''不同的更多信息,''请参阅Bash Hackers Wiki

于 2014-02-04T19:37:01.647 回答
3

.git-prompt当我尝试将它包含在 Windows 上的 bash (MSYS2) 上的 PS1 中时,我遇到了类似的问题。问题是\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$ '

干杯查尔斯达菲发现问题!

于 2016-05-26T14:38:18.990 回答
1

在我的 git-bash Windows VSCode 终端中,$'\n'hack 仍然导致我出现语法错误。经过大量的试验和错误,我设法通过使用换行符的八进制等效项来修复它,即\012.

简而言之,\n\012它给你一个语法错误的地方替换。

于 2021-10-21T20:53:07.797 回答