Синтаксическая ошибка рядом с неожиданным маркером newline: причины и решения
-
Синтаксическая ошибка ‘неожиданный маркер newline’ часто выскакивает в терминале при работе с bash-скриптами или командами. Она портит жизнь разработчикам, особенно когда копируешь код из документации. В этой статье разберем, почему она возникает и как ее быстро починить - без лишней теории.
Эта ошибка помогает понять проблемы с форматированием команд и скриптов. Вы научитесь проверять кодировку, переносы строк и синтаксис. В итоге сэкономите часы на отладку в Linux, Docker или при запуске jq.
Что значит эта ошибка и откуда она берется
Bash выбрасывает ‘синтаксическая ошибка рядом с неожиданным маркером newline’, когда встречает неожиданный конец строки. Это происходит из-за неверных переносов строк - например, CRLF вместо LF, которые Windows пихает в файлы. Или когда копируешь команду из браузера, и там остаются скрытые символы.
Представьте: запускаете docker login, скопировав из доков, и бац - newline ломает все. Похожее бывает с jq, cmake или простыми скриптами в Ubuntu. Парсер bash ожидает продолжения команды, а видит пустую строку. Вот реальные сценарии из форумов: авторизация в Docker, установка jq на AlmaLinux, set-переменные в терминале.
Проблема не в логике кода, а в его ‘физическом’ виде. Давайте разберем типичные случаи.
- Неправильные переносы строк: Файл сохранен в CRLF (Windows), а bash хочет LF (Unix). Проверьте командой
file script.sh- увидите ‘CRLF line terminators’. - Копи-паст из веба: Браузер добавляет невидимые символы или меняет кавычки на смарт-версии.
- Кодировка не UTF-8: Редко, но скрипт в CP1251 или другой вызывает хаос.
Платформа Частая причина Быстрая проверка Windows CRLF вместо LF dos2unix script.shDocker Копипаст команды Введите вручную Ubuntu jq или bash-скрипт dos2unix+bash -n script.shКак диагностировать проблему быстро
Сначала откройте файл в редакторе вроде vim или nano - включите отображение символов. В vim наберите
:set list, и увидите ^M в конце строк - это CRLF. Ошибка newline часто маскирует именно это. Без диагностики лезть в код бесполезно.Дальше проверьте синтаксис без запуска:
bash -n script.sh. Если ошибка на строке 1, дело в первой команде или shebang. В Docker это бывает при login с токеном - пробелы или переносы ломают парсинг. На форумах советуют переключить dash на bash черезdpkg-reconfigure dash, но это редко помогает.Тестируйте поэтапно: разбейте команду на части, запустите по одной. Для jq ошибка newline выскакивает из-за формата JSON в скрипте.
- Проверьте shebang: Должно быть
#!/bin/bash, не#!/bin/shдля сложных скриптов. - Внимание: В
*кавычках вместо'bash может ругаться на newline. - Тест на dash:
sudo dpkg-reconfigure dash- выберите NO, если используете расширения bash.
Инструмент Команда проверки Что показывает file file -bi fileКодировка и переносы hexdump hexdump -C fileСимволы ^M (0D 0A) bash -n bash -n script.shСинтаксис без запуска Основные способы исправления ошибки
Самый надежный фикс -
dos2unix script.sh. Эта утилита меняет CRLF на LF за секунду, работает везде. Установите ее через apt:sudo apt install dos2unix. После этого скрипт запустится без проблем. В Docker просто введите пароль вручную, без копипаста.Для jq или cmake очистите ввод: используйте
echo 'команда' | tr -d '\r'. Если ошибка в терминале, проверьте клавиатуру - иногда автозамена добавляет символы. В ассемблере (как C2400 в MSVC) это неверная инструкция, но для bash фокус на формате.Не забывайте chmod +x после правок. Тестируйте в чистом терминале.
- Примените dos2unix - универсальное решение для 80% случаев.
- Перепишите команду вручную - избавит от скрытых символов.
- Проверьте кодировку:
iconv -f CP1251 -t UTF-8 file.sh > new.sh.
Сценарий Решение Время на фикс Скрипт из Windows dos2unix 10 сек Docker login Ввод вручную 30 сек jq install tr -d ‘\r’ 20 сек Неочевидные ловушки с newline в продакшене
В CI/CD пайплайнах ошибка newline убивает деплой - скрипты из git приходят с CRLF. Настройте .gitattributes с
*.sh eol=lf. В Dockerfiles добавьте RUN dos2unix. Для cmake переменные вроде INSTALLATION_SUFFIX_32 требуют экранирования.Иногда проблема в редакторе: VS Code сохраняет в CRLF по умолчанию - смените на LF в настройках. В Fish или Zsh синтаксис строже, чем в bash.
- Git-ловушка:
git config core.autocrlf falseна сервере. - Редакторы: Nano - OK, Vim -
:set ff=unix. - Массово:
find . -name '*.sh' -exec dos2unix {} +.
Фишки отладки для опытных
Когда базовые шаги прошли, копайте глубже:
bash -x script.shпокажет выполнение по шагам. Для jq используйте--raw-input. В ассемблере проверяйте инструкции на валидность.Сталкивался с этим в микросервисах - один CRLF, и весь билд падает. Собирайте привычку проверять формат сразу.
- Bash -x: Трассировка с подробностями.
--debugв jq: Показывает парсинг JSON.- Строгий режим:
set -euo pipefailв скрипте.
Продвинутый инструмент Когда юзать Пример shellcheck Анализ скрипта shellcheck script.shbashdb Дебаггер bashdb script.shstrace Системные вызовы strace bash script.shКогда newline - симптом больших проблем
Эта ошибка иногда сигнализирует о сломанном окружении: dash вместо bash, или locale не UTF-8. Проверьте
echo $SHELLиlocale. В контейнерах базовый образ может иметь dash по умолчанию.Оставьте за кадром дебаг в продакшене без логов - настройте structured logging заранее. Подумайте о контейнеризации скриптов в Docker с фиксированным bash.
- Неправильные переносы строк: Файл сохранен в CRLF (Windows), а bash хочет LF (Unix). Проверьте командой
© 2024 - 2026 ExLends, Inc. Все права защищены.