Терминальная подсказка, не переносящаяся правильно

Я полностью соглашаюсь, что это - плохая вещь сделать. Но это может быть сделано в debian путем выполнения, как Вы сделали passwd -d root очистить пароль, затем редактируя /etc/pam.d/common-auth. Найдите pam_unix.so строка и добавляет nullok в конец, если не там или изменение nullok_secure быть справедливым nullok если Ваш говорит nullok_secure.

Это продолжает работать Debian ХрипящийСожмите).

178
14.11.2014, 08:54
9 ответов

В непечатаемые последовательности нужно включить \[ и \]. Рассмотрение Вашего PS1 это имеет невложенную последовательность после \W. Но, вторая запись избыточна, а также она повторяет предыдущий оператор "1; 34 дюйма.

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

Как таковой это должно было намереваться окрасить:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.

При хранении "оригинала" это должно также работать:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

Править:

Причина поведения состоит в том потому что bash полагает, что подсказка дольше затем, это на самом деле. Как простой пример, если одно использование:

PS1="\033[0;34m$"
       1 2345678

Подсказка, как полагают, является 8 символами а не 1. Как таковой, если окно терминала составляет 20 столбцов после ввода 12 символов, это, как полагают, 20 и повторяется. Это также очевидно если один затем попытка сделать клавишу Backspace или Ctrl+u. Это останавливается в столбце 9.

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

Если Вы продолжаете вводить строку, должен перенестись к следующей строке после 32 символов.

200
27.01.2020, 19:27
  • 1
    Если Вы будете иметь - или у любого - есть объяснение относительно того, что точно в исходной последовательности заставило строку повторяться по себе, то я буду интересоваться знанием этого. Также +1 для того, как Вы показали это визуально. –   20.12.2013, 04:42
  • 2
    @illuminÉ: не посмотрели на источник, но добавили обновление с примечанием по поведению от наблюдения. –  Runium 20.12.2013, 05:26
  • 3
    На всякий случай, Вы сталкиваетесь с любыми проблемами, можно использовать этот веб-сайт для создания нового - bashrcgenerator.com –  divinedragon 11.12.2015, 08:12
  • 4
    , Это удивительно, спасибо @Runium - Вы возражали бы совместно использовать, как Вы знали это? Я хотел бы найти некоторую документацию относительно этого. –  nycynik 27.03.2017, 22:57
  • 5
    @nycynik: Наблюдение. Я предполагаю, что самым близким к документации относительно этого является исходный код... –  Runium 31.03.2017, 00:17

Это походит на проблему с Вашим COLUMNS & LINES настройки переменной среды. Когда Вы изменяете размер окна, они обычно устанавливаются автоматически терминалом гнома (я верю), можно вынудить их быть вручную установленными путем выдачи команды resize.

Пример

Если я изменяю размер своего терминала гнома к 79x17, мои переменные обнаруживаются как так:

$ echo $COLUMNS; echo $LINES
79
17

Я могу вызвать его как так:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
7
27.01.2020, 19:27
  • 1
    Интересный, но не помогает. –  Muricula 20.12.2013, 00:57
  • 2
    Это устранило мою проблему, она не переносила строки правильно после того, как я выполнил команду "экран".Спасибо!! –  nukeguy 30.05.2017, 23:21

Это в основном связано с размером окна, предполагаемого терминалом, не совпадает с вашим фактическим размером окна. Если вы используете Bash, вы можете попробовать это.

$ shopt checkwinsize

Если вы не получите

checkwinsize    on

, а затем активируйте его

$ shopt -s checkwinsize

, а затем просто попытайтесь запустить другую команду (вроде LS ) или изменение размера окна один раз, вышеупомянутая для меня каждый раз.

Для систем Redhat, в частности, проблема часто вызвана неправильным покрытием ~ / .bashrc не вызывать / etc / bashrc . Обычно нагрузки Bash ~ / .bashrc , который, как ожидается, позвонит / etc / bashrc , который по умолчанию содержит Shopt -s CheckwinSize .

87
27.01.2020, 19:27

Для предотвращения обертывания можно также увеличить количество столбцов, например,

stty columns 120
7
20.08.2021, 13:00

Как упоминалось в других ответах, непечатаемые последовательности, такие как \ e [0; 30m , должны быть заключены в \ [... \] .

Вдобавок (и то, о чем я пока не упоминаю), похоже, что \ r \ n должно быть вне из \ [... \] , если у вас многострочное приглашение. Мне потребовалось несколько проб и ошибок, чтобы наконец понять это.

11
20.08.2021, 13:00

Однажды я где-то прочитал (уже не знаю где ), что использование \001и \002вместо \[и \]может решить эту проблему. Это было для меня.

Между прочим, определение PS1 не должно выглядеть безобразно.

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset
22
20.08.2021, 13:00

Также такая же проблема может быть вызвана использованием широких символов Юникода (, как изhttps://stackoverflow.com/a/34812608/1657819). Вот фрагмент, вызывающий проблему (помните, что $Greenи $Redявляются правильно экранированными цветными строками):

FancyX='\342\234\227'
Checkmark='\342\234\223'


# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi

Bash не может правильно вычислить длину, поэтому проще всего будет избежать двух из трех частей этих широких символов.

FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'
5
20.08.2021, 13:00

Благодаря этой статье моя подсказка работает очень хорошо. А в сочетании с gitprompt(https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh)я получаю именно то, что хочу.

PS1_RESET='\001$(tput sgr0)\002'
PS1_ERROR='$(code=${?##0};echo ${code:+\001$(tput setaf 1)\002[${code}]\ })'"$PS1_RESET"
PS1_SHLVL='\001$(tput setaf 4)\002($SHLVL) '"$PS1_RESET"
PS1_DATE='\001$(tput setaf 5)\002\D{%Y-%m-%d %H:%M:%S} '"$PS1_RESET"
PS1_USER='\001$(tput setaf 6)\002\u'"$PS1_RESET"
PS1_AT='\001$(tput sgr0)\002@'"$PS1_RESET"
PS1_HOST='\001$(tput setaf 2)\002\h'"$PS1_RESET"
PS1_COLON='\001$(tput sgr0)\002:'"$PS1_RESET"
PS1_PATH='\001$(tput setaf 3)\002\w'"$PS1_RESET"
PS1_GIT='$(__git_ps1 " (%s)")'"$PS1_RESET"
PS1_PROMPT=' \\$ '
PS1_COMBINED=$PS1_ERROR$PS1_SHLVL$PS1_DATE$PS1_USER$PS1_AT$PS1_HOST$PS1_COLON$PS1_PATH
export PS1="$PS1_COMBINED"

GIT_PS1_COMPRESSSPARSESTATE=
GIT_PS1_DESCRIBE_STYLE=
GIT_PS1_HIDE_IF_PWD_IGNORED=yes
GIT_PS1_OMITSPARSESTATE=
GIT_PS1_SHOWCOLORHINTS=yes
GIT_PS1_SHOWDIRTYSTATE=yes
GIT_PS1_SHOWSTASHSTATE=yes
GIT_PS1_SHOWUNTRACKEDFILES=yes
GIT_PS1_SHOWUPSTREAM="auto"
GIT_PS1_STATESEPARATOR=" "
export PROMPT_COMMAND='__git_ps1 "$PS1_COMBINED" "$PS1_PROMPT"'
0
20.08.2021, 13:00

У меня есть 2 почти идентичные установки Archlinux, и после того, как я переключил одну на "powerline" PS1 с символами Unicode, у меня возникла та же проблема. Оказалось, что на зараженном ноутбуке отсутствует файл /etc/locale.conf

.
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_COLLATE=en_US.UTF-8

как только я скопировал его, терминал стал распознавать Unicode -и проблема "перекрытия строк" исчезла.

0
14.11.2021, 21:26

Теги

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