I have an issue where if I type in very long commands in bash the terminal will not render what I'm typing correctly. I'd expect that if I had a command like the following:

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com

The command should render on two lines. Instead it will often wrap around and start writing over the top of my prompt, somewhat like this:

myreallylongusername@something.somelongserver.comh -i /path/to/private/key

If I decide to go back and change some argument there's no telling where the cursor will show up, sometimes in the middle of the prompt, but usually on the line above where I'm typing.

Additional fun happens when when I Up to a previous command. I've tried this in both gnome-terminal and terminator and on i3 and Cinnamon. Someone suggested it was my prompt, so here that is:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrll, reset, and clear all do what they say, but when I type the command back in or Up the same things happens.

I checked and checkwinsize is enabled in bash. This happens on 80x24 and other window sizes.

Is this just something I learn to live with? Is there some piece of magic which I should know? I've settled for just using a really short prompt, but that doesn't fix the issue.

  • 1
    So using the command env -i bash --norc fixes it. The $COLUMNS and $LINES match. Does that mean that there's something funny with my .bashrc? – Muricula Dec 20 '13 at 0:44
  • So I commented out my .bashrc and wound up isolating my prompt as the problematic part, specifically the coloration syntax involved. What's wrong with the PS1 above? – Muricula Dec 20 '13 at 0:53
  • 1
    \[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\] seems to avoid the weirdness in the behavior - but don't know if it respects your original prompt completely... – jus cogens prime Dec 20 '13 at 1:19
  • 1
    As per this answer on serverfault, use tput smam – Samveen Oct 23 '17 at 10:38
up vote 153 down vote accepted

Non-printable sequences should be enclosed in \[ and \]. Looking at your PS1 it has a unenclosed sequence after \W. But, the second entry is redundant as well as it repeats the previous statement "1;34".

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

As such this should have intended coloring:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.

Keeping the "original" this should also work:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

Edit:

The reason for the behavior is because bash believes the prompt is longer then it actually is. As a simple example, if one use:

PS1="\033[0;34m$"
       1 2345678

The prompt is believed to be 8 characters and not 1. As such if terminal window is 20 columns, after typing 12 characters, it is believed to be 20 and wraps around. This is also evident if one then try to do backspace or Ctrl+u. It stops at column 9.

However it also does not start new line unless one are on last column, as a result the first line is overwritten.

If one keep typing the line should wrap to next line after 32 characters.

  • 1
    @illuminÉ: Have not looked at the source, but added an update with a note on behavior from observation. – Runium Dec 20 '13 at 3:26
  • 13
    Oh my god, I can't believe I just found an answer to this obscure problem with a single google search. Thank you. – Artur Sapek Jun 15 '15 at 21:00
  • 10
    omg this was a low-level annoyance for MONTHS before I finally googled it and got here. Thanks @Sukminder! – MikeTwo Mar 26 '16 at 19:18
  • 2
    @nycynik: Observation. I guess the closest to documentation on this is the source code ... – Runium Mar 30 '17 at 21:17
  • 3
    I lived with this problem for 3 years, and as I finally took the courage to Google today, it's simply what @ArturSapek said. – Leo Lei Jun 8 '17 at 2:03

It is mostly to do with the size of the window assumed by the terminal is not the same as your actual window size. If you are using bash, you can try this.

$ shopt checkwinsize

If you don't get

checkwinsize    on

Then activate it with

$ shopt -s checkwinsize

Then just attempt running another command (like ls) or resizing the window once, the above works for me every time.

For Redhat systems particularly, the issue is often caused by misconfiguring ~/.bashrc not to call /etc/bashrc. Normally, bash loads ~/.bashrc which is expected to call /etc/bashrc, which by default contains shopt -s checkwinsize.

  • 3
    I've been fighting this issue with terminator for years, and this post solved it. Thanks. – Dev Dec 29 '14 at 19:48
  • 7
    +99 if only I could. – kubanczyk Apr 20 '15 at 8:52
  • Solved for me as well. Thanks! – jbwiv May 27 '15 at 20:33
  • 1
    This answer changed my life – Brad Pitcher Dec 5 '16 at 20:00
  • 2
    It's like... The sun just broke through the clouds... All my base are belong to you. – SadBunny Dec 12 '16 at 11:17

As mentioned in other answers, non-printable sequences such as \e[0;30m should be wrapped with \[...\].

Additionally (and what I don't see mentioned yet) is it seems that \r\n should be outside of the \[...\] if you have a multi-line prompt. It took me some of trial and error to finally figure that out.

  • Yes, indeed - I did \[\e[0;30m\] and it helped. – Ernestas Gruodis Mar 17 at 15:00
  • This is the best day of my life. – John Hunt Sep 4 at 10:18

This sounds like an issue with your COLUMNS & LINES environment variable settings. When you resize the window they're typically set automatically by gnome-terminal (I believe) you can force them to be manually set by issuing the command resize.

Example

If I resize my gnome-terminal to 79x17 my variables show up like so:

$ echo $COLUMNS; echo $LINES
79
17

I can force it like so:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
  • 1
    Interesting, but doesn't help. – Muricula Dec 19 '13 at 22:57
  • 1
    This fixed my issue it was not wrapping lines correctly after I ran the command "screen". Thanks!! – nukeguy May 30 '17 at 20:21

To prevent wrapping, you can also increase the number of columns using, e.g.

stty columns 120
  • not a very good idea, it messed up vim brutally – Blauhirn Sep 23 at 4:53

I once read somewhere (don't know where anymore) that using \001 and \002 instead of \[ and \] can solve this issue. It did for me.

By the way, defining PS1 does not have to look ugly.

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset
  • 1
    My PS1 calls a command that printf escape sequences causing OP's problem. Only this solution fixes the issue for me. – RickMeasham Jun 4 at 6:47

Also the same issue can be caused by using wide unicode symbols (like from https://stackoverflow.com/a/34812608/1657819). Here is the snippet causing the problem (mind the $Green and $Red are properly escaped color strings):

FancyX='\342\234\227'
Checkmark='\342\234\223'


# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi

Bash cannot calculate the length correctly, so easiest way could be to escape 2 out of three parts of those wide symbols.

FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.