← На главную

Shirts linkener лишний \n ломал ссылки через gurk в Signal — спас jq

23.06.2026 21:56 · hackernews

Автор сделал простой сокращатель ссылок под названием shirts linkener (сокращённо shirts). Ничего особенного: однострочный shell-скрипт, который запускается, генерирует короткую ссылку и сразу копирует её в буфер обмена через wl-clipboard. Скрипт кидает POST-запрос через curl, получает JSON, выводит ответ через jq и копирует поле short_url командой wl-copy. Несколько месяцев всё работало без проблем.

Проблемы начались, когда автор решил попробовать gurk — TUI-клиент для Signal на Rust. Он обожает терминальные интерфейсы, поэтому это было логично. Однажды вечером он отправил друзьям ссылку на изображение, лежащее в S3. Те пожаловались на 404. Автор вставил ту же ссылку в Firefox — она открылась. Он снова отправил — заработало.

Ситуация повторилась с несколькими людьми. Через некоторое время автор заметил закономерность: каждая ссылка заканчивалась буквой «j». Оказалось, что он копировал ссылку вместе с символом новой строки (\n) на конце. В большинстве случаев это было незаметно, но в ANSI-терминалах перевод строки отображается как «j» — вот откуда бралась лишняя буква.

После пяти минут жгучего стыда автор нашёл решение: у jq есть аргумент --join-output (-j), который не добавляет перевод строки после каждого вывода. Проблема исчезла.

Мораль истории: терминалы — весёлая штука, а регулярная стрельба себе по ногам отлично учит разбираться в escape-последовательностях и управляющих кодах.

Читать оригинал →