Как включать команды в PS1 Bash, не повреждая расчет длины строки?

Можно попытаться Получить Вещи GNOME. Это - диспетчер задач, который поддерживает задачи организации в дереве (т.е. задачи могут иметь несколько подзадач, и каждая подзадача может иметь несколько других подзадач, и так далее). Это доступно в Ubuntu (взгляд здесь), и поддержки, отмечающие задачу, как сделано с ctrl+d сочетанием клавиш (для других сочетаний клавиш, смотрят здесь).

13
23.05.2017, 15:40
3 ответа

Я нашел ответ на askubuntu.com. @qeirha упомянул, что необходимо сказать удару, что последовательность символов не должна считаться в продолжительность подсказки, и Вы делаете это путем включения его в \[ \]. На основе примера, если, вот одно решение:

red=$(tput setaf 1)

reset=$(tput sgr0)

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$red\] $exit_code \[$reset\] " ")$ '
8
27.01.2020, 19:53
  • 1
    Никакая потребность пойти для Просьбы Ubuntu его. У нас уже есть достаточно ответов на этот вопрос здесь также. –  manatwork 19.12.2013, 20:30
  • 2
    Спасибо за совет @manatwork! Я хотел дать надлежащий кредит на объяснение и предоставил ссылку как любезность. –  Timothy Martin 19.12.2013, 20:36
  • 3
    Предоставление кредита не является проблемой. Но при разговоре о проблеме: незавершенные обратные косые черты раньше исчезали от Скидки с цены, таким образом, Ваша плоскость \[стала [в Вашем сообщении, таким образом отображенный код не был функционален вставкой копии это в терминал. Этого можно избежать при помощи разметки встроенного кода или блока кода. (Как я форматирую свои сообщения с помощью Скидки с цены или HTML?) А-ч –  manatwork 19.12.2013, 20:47
  • 4
    D'oh! Я уже устранил ту же проблему для другого PS1 код, почему я не видел что один? –  l0b0 19.12.2013, 23:05
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$(tput setaf 1)\] $exit_code \[$(tput sgr0)\] " ")$ '

(Извините, никакое объяснение здесь. Посмотрите, Как настроить PS1 правильно? или любой другой вопрос о быстром расчете длины выходит и \[..\].)

1
27.01.2020, 19:53
  • 1
    изменений К второму @l0b0 вопросу, я добавлю то использование PS1 и \[...\] хорошо работает, пока можно поместить весь код, Вы хотите генерировать свою подсказку в единственной строке. Однако, если Вы хотите разделить свой код на небольшие функции, Вы приезжаете в точку, куда Вы не можете поместить запуск и конечные скобки в той же строке/функции. И это повреждается, строка переносятся. Если Вы не обращаетесь к использованию PROMPT_COMMAND повторно вычислить Ваш PS1 при каждой подсказке. –  Tonin 19.12.2013, 22:58

Подробно останавливание @manatwork отвечает, но сохраняя Ваш код, разделяющий PS1 вычислите в различных функциях, можно записать подсказке следующий путь:

set_exit_code() {
    exit_code=$?
    [[ $exit_code -eq 0 ]] || printf "\[$(tput setaf 1)\] $exit_code \[$(tput sgr0)\] "
}
set_bash_prompt() {
    PS1="$(set_exit_code)$ " # with double quotes!
}
PROMPT_COMMAND=set_bash_prompt

Двойные кавычки обязательны оба при установке PS1 и при использовании printf в функции.

1
27.01.2020, 19:53
  • 1
    Для дальнейшего использования используйте функцию удара в Вашем .bashrc - не помещайте код в отдельный файл и вызов это. –  starbeamrainbowlabs 14.01.2016, 10:03

Теги

Похожие вопросы