PS1 command substitution fails when containing newlines on msys bash

backticks, bash, command-substitution, ps1

Solution

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.

Problem

This command succeeds ``` $ PS1='$(date +%s) $ ' 1391380852 $ ``` However if I add a newline it fails ``` $ PS1='$(date +%s)\n$ ' bash: command substitution: line 1: syntax error near unexpected token `)' bash: command substitution: line 1: `date +%s)' ``` If I use backticks it works ``` $ PS1='`date +%s`\n$ ' 1391381008 $ ``` but backticks are discouraged. So what is causing this error? ``` GNU bash, version 4.2.45(6)-release ```

Original source