Почему я не могу использовать $() в 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)  

Они даже имеют цветовую маркировку: user@machine — зеленый, отметка времени — фиолетовый, текущее местоположение — желтый, а любая ветка git — синий. Меня просто немного раздражает, что мне приходится использовать обратные апострофы вместо конструкции $().

Кто-нибудь знает, почему? Готовы помочь мне понять это? Это проблема только при анализе сложных значений приглашения с помощью команд подоболочки, и только тогда проблема, потому что я хочу понять, почему это имеет значение там ... Общие предложения по улучшению всегда приветствуются, пока мы это делаем.

Обновлять -

В настоящее время, когда я пытаюсь использовать $(), я получаю много

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;

Это мне что-то говорит, может быть... Спасибо!


person Paul Hodges    schedule 06.10.2017    source источник
comment
что вы получаете от set | grep BASH_VER (или аналогичного) (какую версию Bash вы используете)? И что произойдет, если вы вместо этого используете $( ... )? Пожалуйста, обновите свой вопрос, а не отвечайте в комментариях. Спасибо и удачи.   -  person shellter    schedule 06.10.2017
comment
Не должно быть проблем с использованием $(...). PS1='$(echo foo) $' gives foo $` как и ожидалось.   -  person chepner    schedule 06.10.2017
comment
Видимо просто артефакт избыточной сложности. Спасибо всем.   -  person Paul Hodges    schedule 06.10.2017


Ответы (1)


Когда вы начнете пытаться встраивать команды в свою подсказку, пора начинать использовать 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'
person chepner    schedule 06.10.2017
comment
Это делает меня счастливым. :) - person Paul Hodges; 06.10.2017