2

Проблема заключается в том, что, если я обновляю PS1 в bashrc, я вижу, что по умолчанию курсор помещается в столбец 0, а не после приглашения, и если я что-то набираю, он начинает перезаписывать приглашение. Я протестировал ту же строку PS1 вручную, удалив файл bashrc, запустив новый сеанс и введя строку PS1 в терминале, и она работала просто отлично.

Я нашел ответ на эту проблему, но это заняло у меня целый день, и я не нашел точного ответа после того, как много гуглил. Основная проблема была с форматом файла bashrc. В моем случае файл был в формате DOS с двухсимвольным концом строки. Исправление состояло в том, чтобы преобразовать файл из DOS в формат UNIX, и после этого он начал работать. Однако я не знаю, как именно формат файла вызвал проблему, он не работал бы, даже если бы «PS1 = 'XXX'» было единственной вещью во всем файле, без каких-либо новых строк.

Следующая ссылка дает информацию о том, как конвертировать файл:http://cs.nyu.edu/~yap/prog/cygwin/FAQs.html#bashrc

1 ответ1

0

Проблема, как вы сказали, в формате DOS. Более конкретно: формат новой строки DOS.

  • Формат новой строки DOS представляет собой строку из двух символов: символ возврата каретки, за которым следует символ перевода строки.
  • Формат новой строки Unix/Linux - это всего лишь один символ: символ перевода строки.

Символ перевода строки часто пишется как \n а символ возврата каретки пишется как \r .

Если у вас есть файл .bashrc формате DOS с объявлением PS1 и bash читает файл, он будет читать следующее:

PS1='XXX'\r\n

Для bash Строка заканчивается как раз перед \n . Таким образом, переменная PS1 определяется как 'XXX'\r . Это строка XXX за которой следует возврат каретки. Возврат каретки означает возврат каретки (мигающий курсор) в начало строки. Баш делает именно это.

Узнайте больше о проблемах с новой строкой в статье в Википедии о новой строке.


Для быстрой проверки, использует ли файл новые строки из dos или unix/linux, вы можете использовать команду file :

$ file bashrc
bashrc: ASCII text
$ file bashrc_dosnewlines 
bashrc_dosnewlines: ASCII text, with CRLF line terminators

CR - возврат каретки, а LF - перевод строки.

Для подробной проверки используйте шестнадцатеричный дампер, например, xxd:

$ xxd bashrc
0000000: 5053 313d 2758 5858 270a                 PS1='XXX'.
$ xxd bashrc_dosnewlines 
0000000: 5053 313d 2758 5858 270d 0a              PS1='XXX'..

Краткое объяснение: вывод имеет три столбца. Первый столбец - это смещение в файле. Второй и последующие столбцы представляют собой шестнадцатеричное представление файла. Последний столбец представляет собой удобочитаемое представление файла. Точки используются для символов, которые не имеют удобного для восприятия человека представления.

Каждая пара шестнадцатеричных цифр обозначает байт, который в случае кодирования ASCII обозначает символ. Например, 50 - это P а 53 - это S Посмотрите коды ASCII для других символов.

0a это \n и 0d0a это \r\n . Всякий раз, когда вы видите группу 0d0a в вашем файле, это признак того, что ваш файл использует новые переводы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .