curl или wget — в чём разница и почему curl скачал пустой файл

Ты хочешь скачать архив из релиза на GitHub. Пишешь:
curl -O https://github.com/user/app/releases/latest/download/app.zip
Файл app.zip появился. Распаковываешь — not a zip file. Смотришь размер — 0 байт. Мы проверили на настоящем релизе.
А сосед в чате советует wget с той же ссылкой — и у него всё скачалось. Кажется, что это две одинаковые качалки, просто разного возраста. Нет. У них разный характер — и он объясняет и пустой файл, и то, почему ИИ всегда пишет curl -fsSL.
Коротко: кто есть кто
- curl — швейцарский нож для HTTP-запросов. Отправляет запрос и выводит ответ в терминал. Скачивание — лишь одно из его умений.
- wget — качалка. Её работа — сохранить файл на диск и не сдаться, даже если связь рвётся.
Представь кран и упаковочную машину. curl — кран: открыл, и струя льётся прямо туда, куда направил. wget — машина: взяла товар, упаковала, поставила на полку.
Разница по пунктам
Куда идёт результат
- curl: в терминал. Скачаешь картинку без флагов — получишь экран мусора. Нужен
-o имяили-O. - wget: сразу в файл в текущей папке.
Редиректы
- curl: по умолчанию не идёт по перенаправлению. GitHub отвечает «файл лежит вон там» (код 302), и curl сохраняет этот ответ — в нём 0 байт. Вот и весь «битый» архив. Лечится флагом
-L. - wget: идёт по редиректам сам.
Ошибки сервера
- curl: на 404 тихо сохраняет страницу ошибки и завершается успешно. Скрипт поедет дальше с HTML вместо архива. Флаг
-fзаставляет его упасть. Что значат эти числа, разобрано в статье про HTTP-коды ответа. - wget: на ошибке сервера возвращает ненулевой код выхода.
Обрыв и докачка
- curl: умеет, но надо помнить флаг
-C -. - wget:
-cпродолжает с места обрыва. И сам повторяет попытки при сбоях сети.
Скачать сайт целиком
- curl: не умеет ходить по ссылкам.
- wget: умеет —
wget -rили--mirror.
Запросы к API
- curl: родная стихия. Методы, заголовки, тело запроса, загрузка файлов — всё флагами. Почти каждая документация API показывает примеры именно на curl. Что такое API, есть в статье что такое REST API.
- wget: может отправить POST, но неудобно.
Где уже стоит
- curl: на macOS, в Windows 10 и 11, почти во всех Linux.
- wget: в большинстве Linux. На Mac его нет — ставь
brew install wget.
Разберём curl -fsSL
Этот набор ты видишь в каждой инструкции по установке. Теперь он читается:
-f— упасть на ошибке сервера, а не сохранить страницу 404;-s— не рисовать полоску прогресса;-S— но ошибки всё-таки показать;-L— идти по редиректам.
Без -f и -L скрипт установки мог бы молча скачать страницу ошибки и выполнить её. Так что это не заклинание — это четыре заплатки на характер curl.
Кому что подойдёт
- Тестируешь API, пишешь запрос для бэкенда, копируешь пример из документации — curl. Даже не думай.
- Ставишь программу по инструкции
curl ... | sh— curl, раз так написано. Но сначала открой скрипт по ссылке в браузере и посмотри, что он делает. - Качаешь большой файл на сервер с нестабильной сетью — wget с
-c. Оборвалось — продолжишь, а не начнёшь сначала. - Нужно утащить сайт или папку с файлами — wget
--mirror. - Скрипт должен работать и на Mac, и на Linux — curl: он есть везде без установки.
Мой совет новичку: выучи curl. Он нужен в девяти случаях из десяти. А wget держи для тяжёлых загрузок на сервере.
Почему в Windows curl ведёт себя странно?
В старом Windows PowerShell 5.1 слово curl — это псевдоним для Invoke-WebRequest, и флаги не работают. Пиши curl.exe — запустится настоящий curl.
Как скачать файл через curl правильно?
curl -fLO адрес — сохранит файл под его именем, пройдёт по редиректам и упадёт на ошибке. Это замена wget адрес одной строкой.
Как увидеть, куда ведёт ссылка?
curl -sIL адрес покажет только заголовки ответов — и всю цепочку редиректов. Так сразу видно, где 302, а где настоящий файл и его размер.
wget умеет то же, что curl?
Не всё. wget — про скачивание по HTTP, HTTPS и FTP. curl понимает десятки протоколов и тонко настраивает любой запрос.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





