Su -c не работает и игнорируется [закрыто]

\033[1;35m— 7 символов. bashне может догадаться, что эти 7 символов на самом деле имеют нулевую ширину. Если нет, он будет думать, что они имеют ширину 7 столбцов.

Он (точнее, readlineосновной редактор строк, который он использует) хочет знать, какова текущая позиция на экране, потому что он использует последовательности позиционирования курсора (вверх, вниз, влево, вправо) для перемещения курсор, когда вы используете клавиши редактирования.

Итак, вы должны указать, какой из символов в подсказке не перемещает курсор. С bashэто делается с помощью \[...\], который сообщает оболочке, что то, что находится внутри, имеет нулевую ширину.

Также обратите внимание, что расширение подсказки в bashраспознает \eкак символ ESC, поэтому вам не нужно использовать echo -e. Вы можете просто сделать:

PS1='\[\e[1;35m\] blah $ '

Если вам нужно использовать echoили лучше printf, вы должны сделать:

PS1='\[$(if ...; then printf "$color1"; fi)\] blah $ '

Или:

PS1='$(if ...; then printf "\[$color1\]"; fi) blah $ '

В zsh, эквивалентом bash\[...\]является %{...%}, как в tcsh. ], но zshимеет директивы для изменения атрибутов символов, так что вам лучше сделать:

PS1='%B%F{magenta}blah $ '

Для полужирного пурпурного переднего плана. Он также имеет некоторые формы условных тестов, в том числе на $?, поэтому ваш красныйв случае ошибки, зеленый в противном случае может быть записан:

PS1='%F{%(?:green:red%)}blah%f $ '

tcshимеет % B, но не %F{цвет}. Итак, вы должны использовать:

set prompt = '%{\e[1;35m%}blah $ '

В ksh88или pdkshвы должны сделать:

PS1=$(printf '\5\r\5\33[1;35m\5blah $ ')

Это определяет символ (здесь 0x5) как escapeсимвол. Затем, заключая текст между парой из них, вы сообщаете оболочке, что он не виден. Вы можете использовать любой символ, кроме 0x5, но в противном случае он не должен встречаться в вашей подсказке, и, кроме как в mksh, он должен игнорироваться терминалом, потому что оболочка действительно записывает его (вместе с символом CR).

ksh93использует только одну последовательность позиционирования курсора: BS(которая перемещает курсор на один столбец влево). Для перемещения вправо он просто перерисовывает одни и те же символы. Таким образом, ему не нужно знать положение курсора, а только ширину каждого введенного вами символа.Это работает до тех пор, пока терминал сам по себе перемещается по краю (поэтому не будет работать должным образом, например, с этим терминатором). Один побочный эффект, если у вас есть подсказка с управляющими последовательностями, заключается в том, что ваши позиции табуляции не будут правильно выровнены.

1
21.11.2018, 23:35
0 ответов

Теги

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