Більшу частину часу вихід команди закінчується символом нового рядка. Але іноді це не відбувається, тому наступне запит оболонки друкується в тому ж рядку разом з висновком.
Приклад:
root @ hostname [~] # echo -n привіт
helloot @ hostname [~] #
Я завжди вважав це дуже прикро.
Тепер я можу просто додати "\ n" на початку змінної PS1, але більшу частину часу, яка надрукує один додатковий рядок, який мені не потрібен.
Чи можна знати, закінчився вихід останньої команди новим рядком чи ні?
Рішення:
(Спасибі Деннісу)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
в одному місці, а зворотні посилання в іншому. Ви можете використовувати $()
в обох.
tput cols
тому що він просто виводить значення змінної COLUMNS у будь-якому випадку, і це повільніше, оскільки це не вбудована оболонка. Ви також захочете включити \e[K
(еквівалент tput el
) для видалення вставленого пробілу, щоб у вас не було купі пробілу пробілів при копіюванні та вставці у випадку за замовчуванням. Нарешті, вам потрібно вкласти всю цю магію між \[
і, \]
або ще, bash спробує вдруге відгадати ваше положення курсору, і воно зіпсується, коли ви редагуєте свою команду / історію.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '