Большую часть времени вывод команды заканчивается символом новой строки. Но иногда этого не происходит, поэтому следующее приглашение оболочки выводится в той же строке вместе с выводом.
Пример:
root @ hostname [~] # echo -n привет
helloroot @ 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]\$ '