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