Как мне получить длинные командные строки для переноса на следующую строку?

Убедитесь, что все непечатаемые байты в вашем 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.