4

В моей системе при использовании цветного приглашения последняя строка вывода предыдущей команды перезаписывается, если последний символ вывода не является новой строкой.

Пример: используя стандартную неокрашенную команду bash, мы имеем:

[myusername@myhostname dirname]$ echo -n foo-bar
foo-bar[myusername@myhostname dirname]$

Это ожидается.

Однако, используя следующую цветную подсказку:

PS1='\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '

у нас (показано здесь без цвета):

myusername@myhostname:~/path/to/dirname$ echo -n foo-bar
myusername@myhostname:~/path/to/dirname$ rname$ 

Курсор теперь находится на последнем "r" в строке. Ввод некоторых символов в командной строке перезаписывает последний «rname $». Конечным результатом является то, что если вывод предыдущей команды не заканчивается новой строкой, я не вижу, что это такое. Это самая важная вещь, которую нужно исправить. То, как появляются дополнительные символы, но их можно перезаписать, меня не сильно беспокоит, но было бы неплохо исправить.

Я пробовал это с другими цветными приглашениями из документации bash, и с некоторыми цветными приглашениями от других ответов супер-пользователей относительно цветных приглашений, и все они ведут себя точно так же.

$ bash --version
GNU bash, version 3.1.17(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Не уверен, но я думаю, что это CentOS, не знаю, какая версия. Дайте мне команду проверить ОС, и я ее запущу.

1 ответ1

4

Мое предпочтительное решение состоит в том, чтобы подсказка всегда начиналась с новой строки. Таким образом, у меня всегда есть пустая строка между последним выводом команды (за исключением, конечно, в этом случае), что кажется мне более естественным. И в худшем случае вместо того, чтобы переписывать текст, который вы видите, я не получаю пустую строку между ними. Если вы не попробуете это некоторое время и просто не сможете выдержать пустую строчку, я очень рекомендую это.

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '

Дополнительное предложение, если вы готовы к этому: я также использую многострочное приглашение, чтобы сделать мою командную строку как можно более длинной перед переносом (или прокруткой, если ваш терминал или оболочка настроены для этого). Мне также нравится знать номер строки истории. Эти двое вместе:

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m \!\]\n\$ '

Наконец, мне также нравится печатать метки времени до и после запуска команд. Упрощенная версия того, что я использую для этого:

export PROMPT_COMMAND="date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap 'date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap DEBUG' DEBUG"

Голова еще не кружится? :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .