Search code examples
bashbackticksps1command-substitution

PS1 command substitution fails when containing newlines on msys bash


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

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.