Использование echo -e в PS1 вызывает проблемы с разрывом строки в shell

Проблемы :

Откройте командную строку:

введите описание изображения здесь

Введите письмо несколько раз:

введите описание изображения здесь

Вместо того, чтобы переносить на новую строку, текст вводится в одну строку:

введите описание изображения здесь

Теперь начните нажимать b. Во второй раз, когда требуется перенос строки, он будет перенесен в новую строку:

введите описание изображения здесь


Что вызывает такое поведение?

Использование PS1, как это, приводит к поведению:

ps1Color="\033[1;35m" export PS1='$(echo -en $ps1Color) Baz $' 

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

Использование цвета напрямую не вызывает такого поведения.


Мои вопросы:

  • Как я могу печатать цветовые коды для использования в PS1 с использованием эха ?
  • Если я хочу сделать свой PS1 другим цветом условно, что это лучший способ сделать это?
  • Почему я вижу это поведение?

Обновить

Чтобы быть ясным, я действительно хочу сделать это, используя эхо, потому что я хочу изменить цвет условно .

Это то, что я сейчас имею сейчас:

 function setPs1Colors_start () { local previousExit=$? local ps1Color="\033[1;35m" local ps1FailBackground="\e[41m" echo -en $ps1Color if [[ previousExit -ne 0 ]] then echo -en $ps1FailBackground fi } function setPs1Colors_end () { local ps1DefaultColor="\033[0m" echo -en $ps1DefaultColor } export PS1='$(setPs1Colors_start)[$(date +%b\-%d\ %k:%M)][$(versionControlInfo)\W]\$$(setPs1Colors_end) ' 

One Solution collect form web for “Использование echo -e в PS1 вызывает проблемы с разрывом строки в shell”

\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 's \[...\] равен %{...%} как в tcsh , но zsh имеет директивы для изменения атрибутов символов, поэтому вы предпочтете:

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

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

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

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

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

В ksh88 или pdksh вы должны:

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

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

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

  • Как изменить приглашение в Linux?
  • Сомнение в ценности переменной среды PS1
  • Правильное место для установки командной строки (PS1) при использовании sh / bash / zsh вместе
  • поведение ssh для пользователя root и non-root
  • Как настроить .bashrc для настройки командной строки?
  • Как избежать этих ложных символов в моей подсказке bash?
  • Как я могу сделать tcsh эхом время выполнения команды до ее выполнения?
  • Показывать только текущий и родительский каталог в приглашении bash
  • Символ ложных @ в начале подсказки bash в Debian Jessie
  • scp с удаленного хоста не удается из-за приветствия входа в систему .bashrc
  • Новое приглашение bash, вызывающее проблемы
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.