bash: Динамическая красочная подсказка

Я даю красочную подсказку, но она никогда не работает полностью. После стольких поисков я определил точку, в которой проблема (полностью удалена).gitуйти от проблемы). Вот он, проявляющийся симптом максимально просто:

           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
Другие вопросы по тегам