Long lines overlap in Bash PS1 customized prompt
Solution 1
Here is my fancy two-line PS1 for bash prompt.
\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]
So here is what I did. If this was my color:
\e[1;32m
I changed it to:
\[\e[1;32m\]
Essentially you need to enclose it in:
\[$mycolor\]
Checkout this answer.
Solution 2
Found this solution online, which suggested a closing brackets to color variables:
Change this:
Black='\e[0;30m' # Black
Red='\e[0;31m' # Red
Green='\e[0;32m' # Green
to:
Black='\e[0;30m\]' # Black
Red='\e[0;31m\]' # Red
Green='\e[0;32m\]' # Green
I've committed the change - hope it works as expected.
Solution 3
My preferred solution to the issue of long lines overlap in bash PS1 is to have a \n
at the end of PS1 prompt line(s).
e.g.
If you want all my other stuff - time, user, host, directory and git branch(!) you can use this (mac or linux):
https://unix.stackexchange.com/a/124012/10043
Related videos on Youtube
![Adam Matan](https://i.stack.imgur.com/QG9pG.jpg?s=256&g=1)
Adam Matan
Team leader, developer, and public speaker. I build end-to-end apps using modern cloud infrastructure, especially serverless tools. My current position is R&D Manager at Corvid by Wix.com, a serverless platform for rapid web app generation. My CV and contact details are available on my Github README.
Updated on September 18, 2022Comments
-
Adam Matan almost 2 years
I have configured a fancy two-line
PS1
bash prompt, with server name, time, user name and other useful variables.PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"
Full Github source here.
The problem is that long lines are often wrapped around themselves, meaning that the new line overlaps the previous one.
The problem is inconsistent: some lines are wrapped correctly, some are not.
Any idea how to fix this?
-
Adam Matan over 11 years+1 Thanks. Oddly enough, it doesn't seem to work on mac.
-
dylnmc almost 8 yearsfor git branch you should use
if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi
. This is a standard when putting git into a script and evaluating the branch name from what I have read previously. -
dylnmc almost 8 yearsnot sure what this is supposed to achieve. You need to wrap anything that doesn't take up space (ansi-escapes) in
\[
\]
, so you can't just end all the ansi-escape colors with\]
because what if there isn't a\[
. When you are putting in non-printable chars, you should just wrap them in\[
\]
(e.g.PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'
). -
Alex Summers over 6 yearsYou're a life saver! As for mac, Adam.. It's most likely due to the column count. Try setting the prompt to just a string of characters, like 'this is my prompt: ' and see if the problem persists. If so, your column setting on your terminal is either too wide or too narrow.
-
Alex Summers over 6 yearsIndeed! Without the opening \[, this boshes the prompt for us linux users. Maybe it's different for OSX? How strange. \[ and \e[ are interpreted as two different things for linux. The first indicates to bash that the sequence following is unprintable and not to count it as part of the displayed characters of the prompt. The \e[ is the escape bracket to start an ANSI color scheme.
-
user2364305 over 3 yearsThis is the only solution to long PS1's breaking when the terminal is small and being resized