Ваша подсказка содержит цвета (и, возможно, другие не -печатные формы ).
В bash вы можете окружить части \[
и \]
, чтобы указать bash игнорировать эти части для расчета длины подсказки.
Пример:
PS1="\e[33mthis is green\e[0m this is normal"
# should be done as:
PS1="\[\e[33m\]this is green\[\e[0m\] this is normal"
Второй имеет \[
и \]
вокруг каждой части, которая при изменении цвета не добавляет никаких видимых символов на дисплее, поэтому не должна учитываться при расчете размещения символов в подсказке.
Если вы модифицировали PS1, убедитесь, что вы не добавили видимые символы \[
и \]
. Если вы это сделали, вытащите их за пределы тех.
Еще одна вещь :Вы можете shopt -q -s checkwinsize
сделать так, чтобы размер терминала обновлялся при изменении его размера.
Похоже, вы используете настройку, которая показывает только конец введенной в данный момент командной строки (аналогично тому, что делает ksh... вы уверены, что используете bash?):Я посмотрю, какая опция может это изменить, но я пока этого не знаю.
редактировать
В чате мы также обсуждали:
set -o emacs #he was in vi mode
set -o posix #he was in posix=no mode
но, в конце концов, кажется, что сработало то, что он избавился от ~/.inputrc (, что он и сделал, он мог содержать что-то неправильное, но я не знаю, что там было, и я не просил удалить его ^^ просто переименовав его (или исправив его содержимое )помогло бы...)
#! /bin/sh -
i=1
for arg do
printf '%2d: %s\n' "$i" "$arg"
i=$((i + 1))
done
То есть, вместо того, чтобы перебирать индексы, перебирайте аргументы и увеличивайте индекс отдельно.
Несколько замечаний по вашему подходу:
оставление расширения параметра без кавычек в контексте списка имеет особое значение, вы почти никогда не захотите этого делать .
В наши дни следует избегать `...`
формы подстановки команд. Вместо этого используйте $(...)
.
Поскольку подстановка команд без кавычек также вызывает split+glob, ее следует использовать с осторожностью. Здесь вы используете часть split , что означает, что у вас есть зависимость от текущего значения $IFS
. Вывод seq
не будет включать подстановочные знаки, поэтому у вас не будет проблем с частью glob .
seq
не является стандартной командой и встречается не во всех системах. Зацикливаться на числах в любом случае не лучший подход, так как это означает сохранение всего вывода в памяти и его разделение (, что приводит к дополнительным копиям в памяти ), а это означает запуск отдельной утилиты в отдельном процессе, даже если оболочка имеет встроенную поддержку для этого.
Если вы не поместите ни -bang(#! /path/to/interpreter -
первую строку ), единственная гарантия, которую вы получите, это то, что она будет интерпретирована оболочкой POSIX sh
(в более старых версиях. систем, которые могут быть даже оболочкой Bourne (не -POSIX )), поэтому вам необходимо убедиться, что используемый вами синтаксис совместим с POSIX. Даже в системах, где sh
предоставляется bash
, не все расширения bash
включены при работе с sh
.
Приведенный выше код совместим с POSIX (и также будет работать в bash
), но не совместим с Bourne (из-за $((...))
синтаксиса арифметического расширения, который не был доступен в оболочке Bourne ). На Solaris 10 и старше,вам нужно изменить -взрыв на #! /usr/xpg4/bin/sh -
, чтобы получить (в основном )POSIX -совместимый интерпретатор