此命令成功
$ 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
答案 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发现问题!