PS1 command substitution fails when containing newlines on msys bash PS1 command substitution fails when containing newlines on msys bash bash bash

PS1 command substitution fails when containing newlines on msys bash


You can disambiguate the parsing easily, to prevent hitting any such bug (though I can't reproduce it myself):

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

This $'\n' syntax parses to a literal newline character, whereas '\n' parses to a string containing a two-character \n escape sequence.

For more info on how $'' differs from '' (expanding backslash-escaped sequences) refer to the Bash Hackers Wiki.


I had a similar issue with .git-prompt when I tried to include it in my PS1 on bash (MSYS2) on Windows. The problem is the \n, if I remove it everything run smoothly but I want to break-line.

By the way on Linux everything is working fine.

The bash is run is: 4.3.42(5)-release (x86_64-pc-msys)

Old, problematic PS1:

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

Fixed:

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

Simplified version (no colors, copy-paste-edit it):

PS1='\u@\h \w $(__git_ps1 "(%s)")'$'\n$ '

Cheers Charles Duffy finding the problem!


The $'\n' hack was still resulting in a syntax error for me in my git-bash Windows VSCode terminal. After a lot of trial and error, I managed to fix it by using the octal equivalent of the newline character, which is \012.

In short, replace \n with \012 wherever it's giving you a syntax error.