Попробуйте:
sudo touch /etc/init.d/arkos-redis
У меня была такая же проблема. Если это не сработает:
sudo strace systemctl enable arkos-redis
Ищите, где произошел последний сбой.
Я понял. Специальные случаи 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
Вы правильно рассчитали \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
в формате. Здесь я бы поставил \e
s, так как они избегают фигурных скобок [
, которым предшествуют.