Проблема, как вы сказали, в формате 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
в вашем файле, это признак того, что ваш файл использует новые переводы.