Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 352
Zombo Avatar asked Feb 02 '14 22:02

Zombo


3 Answers

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.

like image 140
Charles Duffy Avatar answered Nov 10 '22 15:11

Charles Duffy


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!

like image 20
tvl Avatar answered Nov 10 '22 16:11

tvl


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.

like image 1
Word Demon Avatar answered Nov 10 '22 16:11

Word Demon