После модификации $PS1 -Курсоры прыгают влево от командной строки bash

Этой теме 5 лет. Но все же это имхо не полностью ответил. Не хватает небольшого примера. Вот он:

В этом примере:

/dev/sda3 = /
/dev/sda2 = swap

...используя раздел GPT. С разделом MBR (dos )PARTUUID короче, но процедура такая же...

получить PARTUUID с помощью blkid:

blkid -s PARTUUID -o value /dev/sda3 # root
77fd7830-faa2-4e99-a48b-337ad9eded28
blkid -s PARTUUID -o value /dev/sda2 # swap
5b63167a-6fd2-4e72-948c-90832372956c

/boot/grub/grub.cfg:

search --no-floppy --part-uuid --set=root 77fd7830-faa2-4e99-a48b-337ad9eded28

menuentry "GNU/Linux, KERNEL 4.12.7-lfs-8.1" {
  linux /boot/vmlinuz-4.12.7-lfs-8.1 root=PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 net.ifnames=0 ipv6.disable=1 ro rootwait rootfstype=ext4
}

/etc/fstab/:

PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 / ext4 noatime,nodiratime,errors=remount-ro 0 1
PARTUUID=5b63167a-6fd2-4e72-948c-90832372956c swap swap pri=1 0 0

Известно, что это РАБОТАЕТ с lfs8.1 (ядром 4.12.7 )Но я думаю, что это должно работать и с большинством других ядер (старых и новых...)

-1
13.12.2020, 13:46
2 ответа

Чтобы правильно управлять курсором, оболочке необходимо знать, какие части строки подсказки фактически вызывают перемещение курсора, а какие нет.

Для этой цели любые части подсказки, которые не производят видимых символов, должны быть заключены в \\[... \\].

Обратите внимание, что форматирование приглашения в конечном итоге происходит в несколько этапов. :Коды расширения приглашения и переменные оболочки обрабатываются самой оболочкой, но коды цвета и форматирования просто передаются эмулятору терминала, который является отдельным процессом..

Ваша подсказка имеет следующее:

declare -- PS1="\\[\\e]0;\\u@\\h: \\w\\a\\]\${debian_chroot:+(\$debian_chroot)}\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\\h\\[\\e[0m\\]:\\[\\e[97m\\]\\w\\[\\e[0m\\]\\\$ 
  • \\[-начало непродуктивной -части
  • \\e]0;\\u@\\h: \\w\\a-эта часть изменяет заголовок окна в эмуляторах терминала, которые поддерживают эту функцию, поэтому ничего из этого не становится частью реального приглашения.
  • \\]-торцевая непроизводительная -часть
  • \${debian_chroot:+(\$debian_chroot)}-если переменная $debian_chrootустановлена ​​и не -равна нулю (, т. е. оболочка находится внутри chroot-окружения ), выведите ее значение в круглых скобках; в противном случае выведите нулевую строку. Эти расширения полностью обрабатываются внутри оболочки, поэтому оболочка всегда знает, какой длины будет эта часть.
  • \\[-начать другую не -продуктивную часть
  • \\e[1m\\e[38;5;208m\\e[48;5;24m-выделить жирным шрифтом; установить 8-битный -цвет переднего плана; установить 8-битный -цвет фона.Это действительные коды форматов печати, отличные от -.
  • Здесь должен быть код «конец непродуктивной -части», но он отсутствует!
  • \\u@\\h-это создаст текст admin@OLAF, то есть имя пользователя@имя хоста.
  • \\[\\e[0m\\]-правильно инкапсулированный код «сброс к выходу по умолчанию»
  • :-просто вывести двоеточие
  • \\[\\e[97m\\]-правильно инкапсулированный код «установить яркий цвет переднего плана»
  • \\w-расширение приглашения оболочки :вывод текущего рабочего каталога
  • \\[\\e[0m\\]-правильно инкапсулированный код «сброс к выходу по умолчанию»
  • \\\$-приглашение оболочки для специального расширения :вывод $для обычного пользователя или #для root.

Таким образом, из-за отсутствующего кода оболочка предполагает, что строка «admin@OLAF» (, расширенная оболочкой из \\u@\\h), становится частью кодов форматирования и в конечном итоге окажется где-то еще, кроме части фактического приглашения.. Строка имеет длину 10 символов, поэтому, когда оболочке необходимо повторно -написать команду после подсказки, она неправильно вычисляет столбец, к которому нужно перейти, ровно на 10 символов.

1
18.03.2021, 22:43

Здесь отсутствует разделитель\\]:

\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\
                                  ^^
1
18.03.2021, 22:43

Теги

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