此命令成功
$ PS1='$(日期+%s)$' 1391380852 $
但是,如果我添加换行符,它会失败
$ PS1='$(日期+%s)\n$' bash:命令替换:第 1 行:意外标记 `)' 附近的语法错误 bash:命令替换:第 1 行:`date +%s)'
如果我使用反引号,它会起作用
$ PS1='`日期+%s`\n$' 1391381008 $
但不鼓励使用反引号。那么是什么导致了这个错误呢?
GNU bash,版本 4.2.45(6)-发布
此命令成功
$ PS1='$(日期+%s)$' 1391380852 $
但是,如果我添加换行符,它会失败
$ PS1='$(日期+%s)\n$' bash:命令替换:第 1 行:意外标记 `)' 附近的语法错误 bash:命令替换:第 1 行:`date +%s)'
如果我使用反引号,它会起作用
$ PS1='`日期+%s`\n$' 1391381008 $
但不鼓励使用反引号。那么是什么导致了这个错误呢?
GNU bash,版本 4.2.45(6)-发布
您可以轻松消除解析的歧义,以防止遇到任何此类错误(尽管我自己无法重现):
PS1='$(date +%s)'$'\n$ '
此$'\n'
语法解析为文字换行符,而'\n'
解析为包含两个字符的\n
转义序列的字符串。
有关与(扩展反斜杠转义序列)有何$''
不同的更多信息,''
请参阅Bash Hackers Wiki。
.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$ '
干杯查尔斯达菲发现问题!
在我的 git-bash Windows VSCode 终端中,$'\n'
hack 仍然导致我出现语法错误。经过大量的试验和错误,我设法通过使用换行符的八进制等效项来修复它,即\012
.
简而言之,\n
用\012
它给你一个语法错误的地方替换。