Задача: проверить наш скрипт отдельным инструментом

В каталоге ~/linux-scripts у нас лежит скрипт course-report.sh. Мы писали его, проверяли синтаксис командой bash -n и запускали с разными аргументами. Но синтаксическая проверка — это не всё. Скрипт может быть синтаксически правильным и при этом содержать ошибки, которые проявятся только при определённых условиях: не заключённая в кавычки переменная, неожиданное поведение при пустом аргументе, лишняя подстановка. Для поиска таких проблем существуют специальные программы-анализаторы. Один из самых известных для Bash — ShellCheck.

В нашей учебной установке ShellCheck может ещё отсутствовать. Это отдельная программа, которую нужно установить. До этого мы работали только с теми инструментами, которые уже были в системе: ls, grep, find, bash. Теперь пришло время разобраться, откуда вообще берутся программы в Linux и как ими управлять. Это и есть тема сегодняшнего урока.

Прежде чем что-то ставить, проверьте, не установлен ли ShellCheck в системе раньше. Для этого подойдёт команда dpkg -s shellcheck. Она запрашивает статус пакета в локальной базе установленных программ:

dpkg -s shellcheck

У установленного пакета ищите поле Status: install ok installed. Если записи нет, dpkg сообщит, что пакет не установлен и сведений о нём нет. Запись с оставшимися настройками тоже может существовать, поэтому важен именно статус, а не наличие любого вывода. В нашем случае предполагается, что ShellCheck ещё нет, и мы будем его устанавливать. Но проверка нужна всегда: на вашей машине пакет мог появиться раньше, и тогда установка просто обновит его или скажет, что делать нечего.

Пакет, зависимость и репозиторий

Программа, которую мы хотим поставить, распространяется не отдельным файлом, а в виде пакета. Пакет — это архив, внутри которого лежат исполняемые файлы, документация, служебные сценарии и метаданные. Метаданные описывают, что это за пакет, какой у него номер версии, какие ещё пакеты ему нужны для работы и какие файлы он установит. В Ubuntu используется формат пакетов .deb, унаследованный от Debian.

Почему нельзя просто скопировать один файл программы в систему? Потому что программы редко работают в одиночку. ShellCheck написан на языке Haskell, и для его запуска нужны библиотеки, которые тоже должны быть установлены. Эти библиотеки оформлены в виде отдельных пакетов. Когда пакет ShellCheck требует наличия других пакетов, их называют зависимостями. Система управления пакетами сама разберётся, чего не хватает, и предложит установить всё необходимое вместе.

Но откуда система вообще знает, где взять пакет ShellCheck? Из репозитория. Репозиторий — это удалённое хранилище пакетов, которое поддерживает производитель дистрибутива или независимое сообщество. Ubuntu имеет официальные репозитории, в которых собраны десятки тысяч программ, подготовленных для этой версии системы. Когда мы устанавливаем пакет, менеджер пакетов обращается к настроенным репозиториям, скачивает нужный пакет и его зависимости, а затем устанавливает их в систему.

Обновляем индексы пакетов

Перед поиском и установкой нужно обновить локальные списки пакетов. Делается это командой:

sudo apt update

Здесь важно не спутать два действия. Команда apt update не обновляет сами программы. Она скачивает из репозиториев свежие индексы — списки доступных пакетов с версиями и зависимостями. Эти индексы хранятся локально, чтобы apt мог быстро находить пакеты, не опрашивая сеть при каждом запросе. Когда разработчики публикуют новые версии или исправления безопасности, индекс в репозитории меняется. Команда apt update забирает эти изменения к нам на компьютер, чтобы последующие поиск и установка видели актуальную картину.

Вывод команды покажет, сколько источников было проверено и были ли среди них ошибки. Ошибки при обновлении индексов игнорировать нельзя. Если какой-то репозиторий не ответил, индекс для него останется старым или отсутствующим. Тогда установка может не найти свежую версию или вообще не увидеть нужный пакет. В учебной среде ошибки обычно не возникают, но если вы их увидели — сначала разберитесь, и только потом продолжайте.

Ищем и изучаем пакет

Теперь, когда индексы обновлены, найдём ShellCheck в списке доступного:

apt search shellcheck

Команда выведет строки, где в названии или описании встречается слово shellcheck. Обычно первый результат — сам пакет:

shellcheck/noble 0.9.0-1 amd64
  Shell script analysis tool

Поле noble — это кодовое имя Ubuntu 24.04 LTS, а 0.9.0-1 — условная версия. В вашей системе версия может быть другой: репозитории обновляются, и числа меняются. Точная версия на этом уроке не важна, нам важнее сам факт, что пакет есть и доступен.

Чтобы узнать о пакете подробнее, используем другую команду:

apt show shellcheck

Здесь много полей, разберём самые важные. Package — имя пакета. Version — доступная версия. Priority и Section описывают категорию и важность. Installed-Size показывает установленный размер самого пакета; зависимости могут занять дополнительное место. Поле APT-Sources, если оно показано, указывает источник выбранной версии. Depends — список зависимостей, то есть пакетов, без которых ShellCheck не заработает. Description — короткое описание. Вся эта информация берётся из локального индекса и не требует обращения к сети.

Устанавливаем пакет осознанно

Установка в Ubuntu выполняется командой apt install с административными правами:

sudo apt install shellcheck

Мы сознательно не добавляем опцию -y, которая автоматически отвечает «да» на все вопросы. Нам нужно видеть, что именно система собирается сделать. После запуска apt покажет план установки: какие пакеты будут установлены заново, какие — обновлены, сколько места будет занято. Для ShellCheck план может выглядеть так: сам пакет shellcheck и несколько библиотек, которые являются его зависимостями.

Когда план показан, система спросит, продолжать ли. Здесь у нас есть пауза, чтобы прочитать список и убедиться, что среди устанавливаемого нет ничего неожиданного. Только после подтверждения apt начнёт скачивать и устанавливать пакеты. Если план вызывает сомнения, можно ответить «n» и разобраться.

После установки проверим, что программа запускается:

shellcheck --version

Вывод покажет версию ShellCheck и, возможно, информацию о лицензии. Это подтверждает, что исполняемый файл доступен в PATH и система видит новую программу.

Применяем ShellCheck к нашему скрипту

Теперь запустим анализатор на course-report.sh. Важно: ShellCheck не выполняет скрипт, а читает его код и ищет подозрительные места. Наш скрипт создан давно и лежит в ~/linux-scripts:

shellcheck ~/linux-scripts/course-report.sh

Если анализатор найдёт замечания, он выведет их с указанием строк и пояснениями. Вот отдельный условный пример для ошибочной строки с переменными без кавычек. Такой строки в нашей принятой версии нет, номер приведён для иллюстрации:

In course-report.sh line 15:
        cp $source $dest
           ^-----^ SC2086: Double quote to prevent globbing and word splitting.

Каждое замечание имеет код вида SC2086. По нему легко искать объяснения в документации ShellCheck. Если же вывод пустой, это значит, что замечаний нет: скрипт прошёл проверку без претензий. Но пустой вывод — не гарантия, что скрипт безошибочен. Анализатор ловит только те классы проблем, которые умеет распознавать. Многие логические ошибки и несоответствия реальной среде остаются за рамками такого анализа. Поэтому анализ дополняет, но не заменяет запуск и ручную проверку.

Если замечания есть, их можно исправить и запустить проверку снова. Для нашего урока не обязательно доводить скрипт до идеала: главное — увидеть, как работает инструмент, и понять, что он сообщает.

Обновления: индексы обновили, а программы?

Мы уже обновили индексы командой apt update. Но сами программы при этом не изменились. Чтобы узнать, для каких установленных пакетов появились новые версии, используется команда:

apt list --upgradable

Вывод покажет список пакетов с текущей и новой версиями. В учебной среде список может быть пустым, если система была недавно обновлена, или содержать несколько строк. Это зависит от того, когда на вашей машине в последний раз выполнялось обновление.

Если обновления есть, их установка выполняется командой:

sudo apt upgrade

Как и с установкой, здесь не используется -y. Сначала система покажет, что будет обновлено, спросит подтверждение, и только после него начнёт скачивать новые версии. Выполнять это на учебной машине можно, но не обязательно всем ученикам иметь одинаковый результат: у кого-то обновлений нет, у кого-то они есть. Важнее понять разницу: apt update обновляет только списки, apt upgrade — сами пакеты на основе этих списков.

Отдельно стоит сказать об обновлениях безопасности. В Ubuntu есть механизм unattended-upgrades, который может автоматически устанавливать обновления из разрешённых настройкой источников, обычно в том числе исправления безопасности. В этом уроке мы сохраняем существующую настройку. Если apt сообщает о занятой блокировке, дайте текущему обновлению завершиться, не удаляйте lock-файлы вручную. На учебной машине он может уже установить часть обновлений, поэтому ваш вывод apt list --upgradable будет отличаться от вывода соседа.

Откуда берутся пакеты: источники Ubuntu

Все пакеты в нашем уроке приходят из официальных репозиториев Ubuntu. Они настроены в системе по умолчанию. В Ubuntu 24.04 конфигурация источников хранится в формате deb822, и при желании её можно посмотреть в файлах внутри каталога /etc/apt/sources.list.d/. Главный файл — ubuntu.sources:

cat /etc/apt/sources.list.d/ubuntu.sources

В записи источника поле Components может перечислять компоненты main, universe, restricted, multiverse; фактический набор зависит от образа. Если файла ubuntu.sources нет, посмотрите список в sources.list.d и /etc/apt/sources.list: формат зависит также от истории установки. Для урока достаточно понимать, что все они — части официального хранилища Ubuntu, и пакеты из них собраны специально для версии Noble Numbat. Мы не редактируем эти файлы и не добавляем сторонние источники. В интернете часто советуют ставить программы через curl | bash или подключать PPA — личные архивы пакетов от независимых разработчиков. На этом этапе курса мы так не делаем: официальных репозиториев достаточно, а незнакомые источники требуют отдельной оценки доверия.

Что делать после практики

ShellCheck мы установили и проверили им свой скрипт. Теперь встаёт вопрос: удалять ли пакет? Ответ не однозначный. Если ShellCheck не был установлен до урока и вы не планируете писать скрипты дальше, его можно удалить для чистоты. Если же вы продолжаете работать с Bash, полезно оставить его.

Разница между командами удаления важна. apt remove shellcheck удаляет файлы пакета, но оставляет конфигурационные файлы в /etc. apt purge shellcheck удаляет и файлы, и конфигурацию. Обычно пользовательские настройки и данные в домашнем каталоге при remove или purge остаются; purge не означает удаление всех следов программы во всех каталогах. Если бы ShellCheck создавал что-то в /home, это осталось бы на месте. Есть ещё apt autoremove: она удаляет пакеты, которые были установлены как зависимости, но больше не нужны. После удаления ShellCheck часть библиотек может стать ненужной, и autoremove предложит их убрать. Его список нужно просмотреть перед подтверждением: метка «автоматически установлен» не заменяет знания о том, какие программы Вам нужны.

Мы не будем удалять ShellCheck в этом уроке. Он небольшой, взят из официального репозитория и пригодится нам в дальнейшей работе со скриптами. Если вы раньше уже использовали ShellCheck, apt либо обновил существующую версию, либо сообщил, что установлена актуальная. Если пакет вам действительно не нужен, вы знаете, как его удалить.

Урок начался с практической задачи: проверить скрипт course-report.sh анализатором ShellCheck. Мы выяснили, что программы в Ubuntu распространяются пакетами, которые берутся из официальных репозиториев. Команда apt update обновила локальные индексы, не меняя сами программы, затем apt search shellcheck нашла пакет, а apt show shellcheck показала его версию, зависимости и описание. Установка через sudo apt install shellcheck прошла с просмотром плана и подтверждением, без автоматического согласия.

После установки мы проверили версию командой shellcheck --version и запустили анализатор на своём скрипте. ShellCheck не выполняет код, а сообщает о подозрительных местах, и пустой вывод означает отсутствие замечаний, но не гарантирует безошибочность. Мы также посмотрели на механизм обновлений: apt list --upgradable показывает доступные новые версии, а sudo apt upgrade устанавливает их после подтверждения. Все пакеты взяты из официальных источников Ubuntu, без сторонних PPA и непроверенных скриптов.

Репозитории и управление программами: от поиска до диагностики

Вы решили проверить свой скрипт анализатором ShellCheck, но пакет ещё не установлен. Перед установкой нужно понять, чем отличаются apt update и apt upgrade, и откуда именно система возьмёт пакет.

Различить apt update и apt upgrade

Система давно не обновлялась, и вы хотите поставить ShellCheck. Но сначала нужно правильно подготовить локальные данные о пакетах.

11

Команда, которая только обновляет индексы пакетов?

Выбрать команду под задачу управления пакетами

Перед вами несколько задач по работе с ShellCheck. Сопоставьте каждую задачу с подходящей командой.

Проверить, установлен ли shellcheck, и узнать его локальный статус
Посмотреть доступную версию, зависимости и описание пакета
Установить shellcheck с просмотром плана
Найти в индексах всё, что связано со словом shellcheck
apt search shellcheck
apt show shellcheck
dpkg -s shellcheck
sudo apt install shellcheck

Диагностика установки без подключения случайных репозиториев

Выполнив apt install shellcheck, вы получили ошибку «Unable to locate package». Система сообщает, что пакет не найден. Нужно понять причину, не добавляя сторонние источники.

Опишите пошаговый план диагностики ошибки «Unable to locate package shellcheck» в пределах официальных репозиториев Ubuntu. Какие команды вы выполните и что будете искать в их выводе? Укажите, почему вы не станете сразу подключать PPA или выполнять curl | bash. Формат: нумерованный список действий с пояснениями.

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.