Жил визначив вашу головну проблему, але я хотів спробувати пояснити її по-іншому.
Bash інтерпретує спеціальні запити проскакувань лише перед розширенням будь-яких змінних у підказці. Це означає, що використання \eзмінної, розширеної з підказки, не працює, навіть якщо вона працює безпосередньо в PS1.
Наприклад, це працює, як очікувалося, і дає червоний текст:
PS1='\e[1;31m this is in red '
Але це не робить, він просто ставить буквальне \eв підказку:
RED='\e[1;31m'
PS1="$RED not in red "
Якщо ви хочете зберегти кольорові кольори у змінних, ви можете використовувати ANSI-C quoiting ( $'...'), щоб поставити буквальний символ втечі у змінну.
Щоб зробити це, ви можете змінити своє визначення GREEN, REDі NONE, таким чином , їх значення є фактичною послідовністю виходу.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Якщо ви це зробите, ваш перший PS1з цитатами повинен працювати:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Однак тоді у вас виникне друга проблема.
Спробуйте виконати це, потім натисніть Up Arrow, а потім Homeваш курсор не повернеться до початку рядка.
Щоб виправити це, змініть, PS1щоб включити \[і \]навколо послідовностей виділення кольорів, наприклад
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Тут не можна get_exit_statusправильно використовувати , оскільки його вихід містить як друкуючу (код виходу), так і недрукувальну символів (кольорові коди), і немає ніякого способу правильно позначити її у запиті. Розміщення \[...\]позначило б це недруком у повному обсязі, що невірно. Вам доведеться змінити функцію, щоб вона друкувала лише належний кольоровий код, а потім оточувала їх \[...\]у запиті.
\[є\1, і\[є\2. Кому відповідаєRL_PROMPT_{START,END}_IGNOREте, що вимагає, щоб вона ігнорувала байти під час підрахунку довжини запиту на екрані. Див. Списки.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .