Замена команды 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
Ответы
Ответ 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 Чарльз Даффи нашел проблему!