Подтвердить что ты не робот

Замена команды PS1 завершается с ошибкой при использовании новых строк в msys bash

Эта команда успешно завершена

$ 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)'

Если я использую backticks, он работает

$ PS1='`date +%s`\n$ '
1391381008
$

но backticks не рекомендуется. Итак, что вызывает эту ошибку?

GNU bash, version 4.2.45(6)-release
4b9b3361

Ответ 1

Вы можете легко устранить синтаксический разбор, чтобы предотвратить попадание любой такой ошибки (хотя я не могу воспроизвести ее сам):

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

Этот синтаксис $'\n' анализирует символ литерала новой строки, тогда как '\n' анализирует строку, содержащую двухсимвольную escape-последовательность \n.

Для получения дополнительной информации о том, как $'' отличается от '' (расширение последовательностей с обратным слэшем-экранированием), обратитесь к Bash Hackers Wiki.

Ответ 2

У меня была аналогичная проблема с .git-prompt, когда я попытался включить ее в свой PS1 на bash (MSYS2) в Windows. Проблема в том, что \n, если я удалю все, все работает плавно, но я хочу использовать прерывание.

Кстати, в Linux все работает нормально.

Выполняется bash: 4.3.42(5)-release (x86_64-pc-msys)

Старый, проблемный PS1:

PS1='\e[32m\]\[email protected]\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")\nλ \e[0m\]$(tput sgr0)'

Fixed

PS1='\e[32m\]\[email protected]\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")'$'\nλ \e[0m\]'

Упрощенная версия (без цветов, copy-paste-edit):

PS1='\[email protected]\h \w $(__git_ps1 "(%s)")'$'\n$ '

Cheers Чарльз Даффи нашел проблему!