Выдать последовательность приглашения bash нулевой ширины из внешнего двоичного файла

Попробуйте:

  • sudo touch /etc/init.d/arkos-redis

У меня была такая же проблема. Если это не сработает:

  • sudo strace systemctl enable arkos-redis

Ищите, где произошел последний сбой.

6
03.03.2019, 23:00
2 ответа

Я понял. Специальные случаи Bash -\e, \[и \]в PS1. Он преобразует \eв управляющий байт, \[в байт 1и \]в байт 2. Внешние команды должны записывать 1и 2байт на стандартный вывод.

Согласно ASCII, они кодируют «начало заголовка» и «начало текста».

http://www.columbia.edu/kermit/ascii.html

Вот рабочий пример, основанный на преобразовании printf \escape-символов в первом позиционном параметре в правильные байты:

PS1='$( render-prompt )'
function render-prompt {
  printf '\1\033[0;35m\2$ \1\033[00m\2'
}
render-prompt | hexdump -C
00000000  01 1b 5b 30 3b 33 35 6d  02 24 20 01 1b 5b 30 30  |..[0;35m.$..[00|
00000010  6d 02                                             |m.|
00000012
4
27.01.2020, 20:28

Вы правильно рассчитали \1, \2и \e. Но есть лучший и более правильный способ создания последовательностей.

Команда printfпринимает FORMAT в качестве первого аргумента. Этот формат использует последующие аргументы. Так что вашу функцию можно было бы лучше написать так:

render-prompt () { printf "\1%b\2%s\1%b\2" '\e[0;35m' '$ ' '\e[00m'; }

Первый аргумент — "\1%b\2%s\1%b\2", и это формат. Это хорошее и логичное место для \1и \2, которые охватывают параметры %b. (%b— это\-экранированные строки, а %s— стандартная строка.)

Остальные — '\e[0;35m', '$ 'и '\e[00m', которые соответствуют %b, %sи %bв формате. Здесь я бы поставил \es, так как они избегают фигурных скобок [, которым предшествуют.

1
27.01.2020, 20:28

Теги

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