PS1 command substitution fails when containing newlines on msys bash

帅比萌擦擦* 提交于 2019-11-27 16:03:38

问题


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

回答1:


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.




回答2:


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!



来源:https://stackoverflow.com/questions/21517281/ps1-command-substitution-fails-when-containing-newlines-on-msys-bash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!