Почему один перенос строки может сломать скрипт

Для человека конец строки выглядит одинаково, но в файле он хранится как набор байтов. В Unix-подобных системах обычно используется один байт — `LF` (перевод строки, `0A` в шестнадцатеричной записи). Windows обычно записывает два: `CR` (`0D`, возврат каретки) и `LF` (`0A`). Это называют окончаниями строк LF и CRLF.

Разница выросла из работы печатных устройств. Возврат каретки сдвигал печатающую головку к началу строки, а перевод строки подавал бумагу вверх. На старых терминалах для перехода к новой строке могли требоваться обе операции. Unix выбрал для обозначения конца строки один управляющий символ; Windows сохранила пару.

Что происходит при несовпадении форматов

Программа, читающая текст, должна распознать, где заканчивается строка. Если она ожидает LF, а получает CRLF, но не удаляет `CR`, этот невидимый символ может стать частью команды или имени файла. Например, оболочка может попытаться выполнить команду с лишним символом в конце и сообщить, что такой команды нет. Поэтому скрипт, который работал в Windows, иногда не запускается после переноса на Linux.

Обратная ситуация тоже возможна: старое приложение Windows, рассчитанное на CRLF, может показать LF-разделённый файл как одну длинную строку. Современные редакторы обычно умеют распознавать оба варианта, но отдельные скрипты, компиляторы и инструменты обработки текста могут быть менее терпимы.

Как избежать неожиданности

При переносе проекта полезно настроить редактор или систему контроля версий на единый формат окончаний строк. Тогда незаметное различие в байтах не превращается в загадочную ошибку — и не создаёт огромный список изменений в файле, где поменялись только переносы.