Этой теме 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 )Но я думаю, что это должно работать и с большинством других ядер (старых и новых...)
Чтобы правильно управлять курсором, оболочке необходимо знать, какие части строки подсказки фактически вызывают перемещение курсора, а какие нет.
Для этой цели любые части подсказки, которые не производят видимых символов, должны быть заключены в \\[
... \\]
.
Обратите внимание, что форматирование приглашения в конечном итоге происходит в несколько этапов. :Коды расширения приглашения и переменные оболочки обрабатываются самой оболочкой, но коды цвета и форматирования просто передаются эмулятору терминала, который является отдельным процессом..
Ваша подсказка имеет следующее:
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 символов.
Здесь отсутствует разделитель\\]
:
\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\
^^