bash: Динамическая красочная подсказка
Я даю красочную подсказку, но она никогда не работает полностью. После стольких поисков я определил точку, в которой проблема (полностью удалена).git
уйти от проблемы). Вот он, проявляющийся симптом максимально просто:
- В продолжение bash: красочная подсказка и длинная командная строка . Мне нужно закрыть escape-последовательности с помощью
\]
для того, чтобы «readline» правильно рассчитывал видимую длину подсказки - Это работает с
PS1
установка статическая , но не динамическая :
echo -e '\e[33m\]00\e[0m\]' | tee /tmp/p
PS1="\n\w`cat /tmp/p`\\\$ "
PS1='\n\w`cat /tmp/p`\\\$ '
echo -e '\[\e[33m\]00\[\e[0m\]' | tee /tmp/p
1 ответ
Кажется, Bash(+readline) обнаруживает и до того, как подстановка команды () будет расширена. Если или появляются из-за подмены, то уже поздно дать желаемый эффект и они появляются дословно.
Он работает с настройкой статически, но не динамически.
Не совсем. ФормальноPS1
(переменная) является статической в обоих случаях. В случае двойных кавычек переменная содержит результат подстановки команды, полученный один раз при присваивании. В случае одинарных кавычек переменная содержит эту литеральную строку. В обоих случаях значение переменной фиксируется после ее присвоения и не изменяется автоматически.
Тем не менее, когда оболочка интерпретирует последнее статическое значение с целью печати приглашения, она расширяется. Таким образом, в этом случае приглашение действительно является динамическим, но не переменная.
Решение состоит в том, чтобы сделать переменную по-настоящему динамической, то есть заставить что-то обновлять ее значение каждый раз непосредственно перед тем, как оболочка потребует переменную. Значение должно содержать результат`cat /tmp/p`
, так что все\[
и\]
(в том числе из/tmp/p
) присутствуют, когда оболочка начинает интерпретировать значение.
Это можно сделать с помощью .
PROMPT_COMMAND
Если установлено, значение интерпретируется как команда, которую необходимо выполнить перед печатью каждого основного приглашения ($PS1
).
(источник)
Пример:
echo -e '\[\e[33m\]00\[\e[0m\]' | tee /tmp/p # taken from your code
update_PS1 () { PS1="\n\w`cat /tmp/p`\\\$ "; }
PROMPT_COMMAND=update_PS1