Bash использует экранирование \[
и \]
в приглашении, чтобы определить длину строки и место для переноса. Если вы добавляете что-то, что не должно влиять на длину строки (escape-последовательности, $ foo и т. Д.), С теми, с кем у вас все должно быть в порядке.
Я не уверен, почему ваша подсказка не работает (и я не распознаю некоторые escape-последовательности, такие как \ e [s, возможно, вы используете что-то отличное от vt100), моя попытка работает просто штраф:
PS1='\[\e7\e[0;$((COLUMNS-(${#foo})))H$foo\e8\][\u@\h \W]\$ '
на самом деле пересматривает ваш, это может сработать, если вы измените PS1 на
PS1="\u@\h \W \$ \[\e[s\e[1;\$(echo -n \${POS})H$foo\e[u\]"
То есть, оборачивая \[ ... \]
вокруг всего нестандартного материала.