Я полностью соглашаюсь, что это - плохая вещь сделать. Но это может быть сделано в debian путем выполнения, как Вы сделали passwd -d root
очистить пароль, затем редактируя /etc/pam.d/common-auth
. Найдите pam_unix.so
строка и добавляет nullok
в конец, если не там или изменение nullok_secure
быть справедливым nullok
если Ваш говорит nullok_secure
.
В непечатаемые последовательности нужно включить \[
и \]
. Рассмотрение Вашего 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 символов.
Это походит на проблему с Вашим COLUMNS
& LINES
настройки переменной среды. Когда Вы изменяете размер окна, они обычно устанавливаются автоматически терминалом гнома (я верю), можно вынудить их быть вручную установленными путем выдачи команды resize
.
Если я изменяю размер своего терминала гнома к 79x17, мои переменные обнаруживаются как так:
$ echo $COLUMNS; echo $LINES
79
17
Я могу вызвать его как так:
$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
Это в основном связано с размером окна, предполагаемого терминалом, не совпадает с вашим фактическим размером окна. Если вы используете Bash, вы можете попробовать это.
$ shopt checkwinsize
Если вы не получите
checkwinsize on
, а затем активируйте его
$ shopt -s checkwinsize
, а затем просто попытайтесь запустить другую команду (вроде LS
) или изменение размера окна один раз, вышеупомянутая для меня каждый раз.
Для систем Redhat, в частности, проблема часто вызвана неправильным покрытием ~ / .bashrc
не вызывать / etc / bashrc
. Обычно нагрузки Bash ~ / .bashrc
, который, как ожидается, позвонит / etc / bashrc
, который по умолчанию содержит Shopt -s CheckwinSize
.
Для предотвращения обертывания можно также увеличить количество столбцов, например,
stty columns 120
Как упоминалось в других ответах, непечатаемые последовательности, такие как \ e [0; 30m
, должны быть заключены в \ [... \]
.
Вдобавок (и то, о чем я пока не упоминаю), похоже, что \ r \ n
должно быть вне из \ [... \]
, если у вас многострочное приглашение. Мне потребовалось несколько проб и ошибок, чтобы наконец понять это.
Однажды я где-то прочитал (уже не знаю где ), что использование \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
Также такая же проблема может быть вызвана использованием широких символов Юникода (, как из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'
Благодаря этой статье моя подсказка работает очень хорошо. А в сочетании с 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"'
У меня есть 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 -и проблема "перекрытия строк" исчезла.