кольорова підказка bash перезаписує вихід попередньої команди, якщо вивід не закінчується символом нового рядка


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, не знаю, яка версія. Дайте мені команду перевірити O.S., і я запустити його.


1
Непар. Яку операційну систему і яку версію bash? Я не бачу описану поведінку з даним запитом на Mac OS X 10.7.4, використовуючи bash 3.2 і bash 4.2. Також, чи встановлено значення PROMPT_COMMAND? Боюся, що у мене немає ніяких пропозицій, але, можливо, хтось інший може використати цю інформацію, щоб запропонувати рішення.
chepner

Неможливо відтворити його - мій bash [3.2.48 (1) -реліз (x86_64-apple-darwin11)] на OS X 10.7.4 не відображає цю поведінку в Terminal.app. Враховуючи, що ваші коди кольорового вимкнення правильно укладені у квадратні дужки, вони також не повинні. Спробуйте скасувати налаштування PROMPT_COMMAND щоб побачити, чи зберігається поведінка. Також було б корисно, якщо ви вказали вашу версію bash (запустіть bash -- version ) і ОС.
kopischke

Не знайомий з PROMPT_COMMAND. Я тільки що встановлював PS1. unset PROMPT_COMMAND не допомагає. $ echo $PROMPT_COMMAND дає echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\033\\"
Eddified

Примітка: я редагував оригінальний запит, додав інформацію про версію bash.
Eddified

Відповіді:


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"

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


3
Це чітко обходить питання ОП, але це не так адресу Проблема ОП - яку варто розглянути, розглядаючи це питання не відтворюється в системах OS X ( 1 , 2 ), наприклад (чи це на вашому?).
kopischke
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.