Убедитесь, что все непечатаемые байты в вашем PS1 содержатся в \[ \]. В противном случае bash будет считать их в строке запроса. Он использует длину подсказки, чтобы определить, когда нужно обернуть линию.
Например, здесь bash подсчитывает приглашение шириной 19 столбцов, а приглашение, отображаемое терминалом, имеет ширину всего 10 колонок (My prompt, написанный в циане, и >, написанный по умолчанию):
PS1='\e[36mMy prompt\e[0m>' # bash count: 19, actual: 10
, в то время как здесь он подсчитывает только приглашение шириной 10 колонок, поскольку он игнорирует байты между специальными \[ и \] escapes:
PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10
Для хорошей практики используйте tput для генерации выводов терминала, а не для их жесткого кодирования:
cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0) # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'
См. http: // mywiki. wooledge.org/BashFAQ/053, а также http://wiki.bash-hackers.org/scripting/terminalcodes для tput.