<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Синтаксическая ошибка рядом с неожиданным маркером newline: причины и решения]]></title><description><![CDATA[<p dir="auto">Синтаксическая ошибка ‘неожиданный маркер newline’ часто выскакивает в терминале при работе с bash-скриптами или командами. Она портит жизнь разработчикам, особенно когда копируешь код из документации. В этой статье разберем, почему она возникает и как ее быстро починить - без лишней теории.</p>
<p dir="auto">Эта ошибка помогает понять проблемы с форматированием команд и скриптов. Вы научитесь проверять кодировку, переносы строк и синтаксис. В итоге сэкономите часы на отладку в Linux, Docker или при запуске jq.</p>
<h2>Что значит эта ошибка и откуда она берется</h2>
<p dir="auto">Bash выбрасывает ‘синтаксическая ошибка рядом с неожиданным маркером newline’, когда встречает неожиданный конец строки. Это происходит из-за неверных переносов строк - например, CRLF вместо LF, которые Windows пихает в файлы. Или когда копируешь команду из браузера, и там остаются скрытые символы.</p>
<p dir="auto">Представьте: запускаете docker login, скопировав из доков, и бац - newline ломает все. Похожее бывает с jq, cmake или простыми скриптами в Ubuntu. Парсер bash ожидает продолжения команды, а видит пустую строку. Вот реальные сценарии из форумов: авторизация в Docker, установка jq на AlmaLinux, set-переменные в терминале.</p>
<p dir="auto">Проблема не в логике кода, а в его ‘физическом’ виде. Давайте разберем типичные случаи.</p>
<ul>
<li><strong>Неправильные переносы строк</strong>: Файл сохранен в CRLF (Windows), а bash хочет LF (Unix). Проверьте командой <code>file script.sh</code> - увидите ‘CRLF line terminators’.</li>
<li><strong>Копи-паст из веба</strong>: Браузер добавляет невидимые символы или меняет кавычки на смарт-версии.</li>
<li><strong>Кодировка не UTF-8</strong>: Редко, но скрипт в CP1251 или другой вызывает хаос.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Платформа</th>
<th>Частая причина</th>
<th>Быстрая проверка</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows</td>
<td>CRLF вместо LF</td>
<td><code>dos2unix script.sh</code></td>
</tr>
<tr>
<td>Docker</td>
<td>Копипаст команды</td>
<td>Введите вручную</td>
</tr>
<tr>
<td>Ubuntu</td>
<td>jq или bash-скрипт</td>
<td><code>dos2unix</code> + <code>bash -n script.sh</code></td>
</tr>
</tbody>
</table>
<h2>Как диагностировать проблему быстро</h2>
<p dir="auto">Сначала откройте файл в редакторе вроде vim или nano - включите отображение символов. В vim наберите <code>:set list</code>, и увидите ^M в конце строк - это CRLF. Ошибка newline часто маскирует именно это. Без диагностики лезть в код бесполезно.</p>
<p dir="auto">Дальше проверьте синтаксис без запуска: <code>bash -n script.sh</code>. Если ошибка на строке 1, дело в первой команде или shebang. В Docker это бывает при login с токеном - пробелы или переносы ломают парсинг. На форумах советуют переключить dash на bash через <code>dpkg-reconfigure dash</code>, но это редко помогает.</p>
<p dir="auto">Тестируйте поэтапно: разбейте команду на части, запустите по одной. Для jq ошибка newline выскакивает из-за формата JSON в скрипте.</p>
<ul>
<li><strong>Проверьте shebang</strong>: Должно быть <code>#!/bin/bash</code>, не <code>#!/bin/sh</code> для сложных скриптов.</li>
<li><em>Внимание</em>: В <code>*</code> кавычках вместо <code>'</code> bash может ругаться на newline.</li>
<li><strong>Тест на dash</strong>: <code>sudo dpkg-reconfigure dash</code> - выберите NO, если используете расширения bash.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Инструмент</th>
<th>Команда проверки</th>
<th>Что показывает</th>
</tr>
</thead>
<tbody>
<tr>
<td>file</td>
<td><code>file -bi file</code></td>
<td>Кодировка и переносы</td>
</tr>
<tr>
<td>hexdump</td>
<td><code>hexdump -C file</code></td>
<td>Символы ^M (0D 0A)</td>
</tr>
<tr>
<td>bash -n</td>
<td><code>bash -n script.sh</code></td>
<td>Синтаксис без запуска</td>
</tr>
</tbody>
</table>
<h2>Основные способы исправления ошибки</h2>
<p dir="auto">Самый надежный фикс - <code>dos2unix script.sh</code>. Эта утилита меняет CRLF на LF за секунду, работает везде. Установите ее через apt: <code>sudo apt install dos2unix</code>. После этого скрипт запустится без проблем. В Docker просто введите пароль вручную, без копипаста.</p>
<p dir="auto">Для jq или cmake очистите ввод: используйте <code>echo 'команда' | tr -d '\r'</code>. Если ошибка в терминале, проверьте клавиатуру - иногда автозамена добавляет символы. В ассемблере (как C2400 в MSVC) это неверная инструкция, но для bash фокус на формате.</p>
<p dir="auto">Не забывайте chmod +x после правок. Тестируйте в чистом терминале.</p>
<ol>
<li>Примените <strong>dos2unix</strong> - универсальное решение для 80% случаев.</li>
<li>Перепишите команду вручную - избавит от скрытых символов.</li>
<li>Проверьте <em>кодировку</em>: <code>iconv -f CP1251 -t UTF-8 file.sh &gt; new.sh</code>.</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Решение</th>
<th>Время на фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td>Скрипт из Windows</td>
<td>dos2unix</td>
<td>10 сек</td>
</tr>
<tr>
<td>Docker login</td>
<td>Ввод вручную</td>
<td>30 сек</td>
</tr>
<tr>
<td>jq install</td>
<td>tr -d ‘\r’</td>
<td>20 сек</td>
</tr>
</tbody>
</table>
<h2>Неочевидные ловушки с newline в продакшене</h2>
<p dir="auto">В CI/CD пайплайнах ошибка newline убивает деплой - скрипты из git приходят с CRLF. Настройте .gitattributes с <code>*.sh eol=lf</code>. В Dockerfiles добавьте RUN dos2unix. Для cmake переменные вроде INSTALLATION_SUFFIX_32 требуют экранирования.</p>
<p dir="auto">Иногда проблема в редакторе: VS Code сохраняет в CRLF по умолчанию - смените на LF в настройках. В Fish или Zsh синтаксис строже, чем в bash.</p>
<ul>
<li><strong>Git-ловушка</strong>: <code>git config core.autocrlf false</code> на сервере.</li>
<li><em>Редакторы</em>: Nano - OK, Vim - <code>:set ff=unix</code>.</li>
<li><strong>Массово</strong>: <code>find . -name '*.sh' -exec dos2unix {} +</code>.</li>
</ul>
<h2>Фишки отладки для опытных</h2>
<p dir="auto">Когда базовые шаги прошли, копайте глубже: <code>bash -x script.sh</code> покажет выполнение по шагам. Для jq используйте <code>--raw-input</code>. В ассемблере проверяйте инструкции на валидность.</p>
<p dir="auto">Сталкивался с этим в микросервисах - один CRLF, и весь билд падает. Собирайте привычку проверять формат сразу.</p>
<ul>
<li><strong>Bash -x</strong>: Трассировка с подробностями.</li>
<li><code>--debug</code> в jq: Показывает парсинг JSON.</li>
<li><em>Строгий режим</em>: <code>set -euo pipefail</code> в скрипте.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Продвинутый инструмент</th>
<th>Когда юзать</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td>shellcheck</td>
<td>Анализ скрипта</td>
<td><code>shellcheck script.sh</code></td>
</tr>
<tr>
<td>bashdb</td>
<td>Дебаггер</td>
<td><code>bashdb script.sh</code></td>
</tr>
<tr>
<td>strace</td>
<td>Системные вызовы</td>
<td><code>strace bash script.sh</code></td>
</tr>
</tbody>
</table>
<h2>Когда newline - симптом больших проблем</h2>
<p dir="auto">Эта ошибка иногда сигнализирует о сломанном окружении: dash вместо bash, или locale не UTF-8. Проверьте <code>echo $SHELL</code> и <code>locale</code>. В контейнерах базовый образ может иметь dash по умолчанию.</p>
<p dir="auto">Оставьте за кадром дебаг в продакшене без логов - настройте structured logging заранее. Подумайте о контейнеризации скриптов в Docker с фиксированным bash.</p>
]]></description><link>https://forum.exlends.ru/topic/951/sintaksicheskaya-oshibka-ryadom-s-neozhidannym-markerom-newline-prichiny-i-resheniya</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 05:45:16 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/951.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Mar 2026 07:11:18 GMT</pubDate><ttl>60</ttl></channel></rss>