为什么我不能在PS1中使用$(…)而不是反引号?

我目前的PS1:

PS1='\[\033]0;$TITLEPREFIX:${PWD//[^[:ascii:]]/?}\007\]\n\[\033[32m\]\u@\h \[\033[35m\]`date +%Y-%m-%d,%H:%M:%S` \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$: ' 

是的,这是一个混乱,但它为我很好 – 我的提示是这样的:

 P2759474@RVPTINTCL415MQC 2017-10-06,11:20:18 ~/repos/jdk (master) 

它们甚至是颜色编码,用户@机器绿色,时间戳紫色,当前位置黄色,任何git分支蓝色。 我只是有点恼火,我不得不使用反引号而不是一个$()构造。

任何人知道为什么 愿意帮助我理解吗? 使用subshel​​l命令parsing复杂的提示值时,这只是一个问题,只是一个问题,因为我想了解为什么它在那里很重要。一般的改进build议总是欢迎,而我们在这。

更新 –

目前,当我尝试使用$(),我得到了很多

 bash: command substitution: line 1: syntax error near unexpected token ')' bash: command substitution: line 1: 'date +%Y-%m-%d,%H:%M:%S)' bash: command substitution: line 1: syntax error near unexpected token ')' bash: command substitution: line 1: '__git_ps1)' 

我的环境

 BASH_VERSINFO=([0]="4" [1]="3" [2]="42" [3]="5" [4]="release" [5]="x86_64-pc-msys") BASH_VERSION='4.3.42(5)-release' [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no; 

这告诉我什么,也许…谢谢!

当您开始尝试在命令中嵌入命令时,是时候开始使用PROMPT_COMMAND

 # You won't even have to put the title-bar stuff in your prompt # and there are already shortcuts for date and time set_titlebar () { printf '\033]0;%s:%s\007' "$TITLEPREFIX" "${PWD//[^[:ascii:]]/?}" } set_prompt () { PS1='\[\033[32m\]\u@\h ' # user@host in green PS1+='\[\033[35m\]\D{%Y-%m-%d},\t ' # Don't need date PS1+='\[\033[33m\]\w\[\033[36m\]' # Directory in orange PS1+=$(__git_ps1) # git info, if appropriate PS1+='\[\033[0m\]\n$: ' } PROMPT_COMMAND='set_titlebar;set_prompt'