Введение
Когда компьютеры стали чем‑то большим, чем «считывателями» перфокарт, понадобилась операционная система, обеспечивающая удобный доступ к ресурсам: памяти, диску и т. д. Действительно, проще написать программу, обращаясь к интерфейсу доступа к ресурсам, чем встраивать драйверы непосредственно в программу. Так, в 1970‑х в стенах Bell Labs появился UNIX и более или менее та самая командная строка. Последнюю ещё называют оболочкой, так как по сути она является внешним интерфейсом операционной системы.
Командная строка — не что иное, как интерпретатор команд, позволяющий запускать программы. Чаще всего интерпретатор — это не просто прослойка между вами и ядром, но и язык программирования с переменными, циклами, условными операторами и функциями. Используя специальный синтаксис, можно писать скрипты, а в сочетании с другими программами‑утилитами они становятся незаменимым инструментом в повседневных задачах. Например, в экосистеме Arch активно используются bash‑скрипты; можно даже сказать, что Arch это ядро и набор скриптов.
Несмотря на то что оболочка‑интерпретатор — это язык программирования, это плохой язык программирования. Для сложных задач лучше использовать подходящий инструмент, а не писать плохо читаемые портянки на
bash.
Личное мнение автора
В UNIX‑подобных системах можно менять командный интерпретатор в зависимости от предпочтений. Самые популярные сегодня — bash, zsh, fish, csh/tcsh, dash и другие. Системный интерпритатор, /bin/sh, в Ubuntu указывает на dash, в то время как интерактивная оболочка для пользователя по умолчанию является bash. В macOS, также UNIX‑подобной, по умолчанию используется zsh. Функциональность, а также синтаксис оболочек часто различаются до несовместимости: dash ближе к POSIX, а bash и zsh — нет. Зато в последних двух есть автодополнение по клавише Tab. В zsh, в отличие от bash, можно подключать плагины. У csh — Си‑подобный синтаксис; у остальных — нет.
Графический интерфейс (GUI) удобен, но не так гибок и функционален, как командная строка. Просматривать веб‑страницы комфортнее в графическом браузере (хотя существуют и консольные), но для автоматизации и многих других задач командная строка — незаменимый инструмент.
Командная строка стала удобной во многом благодаря философии UNIX — набору культурных норм и подходов к разработке ПО. Кратко и упрощённо: (а) лучше писать маленькие программы, которые выполняют одну задачу и делают это максимально хорошо; (б) следует использовать текстовый ввод/вывод и делать так, чтобы входом одной программы мог быть вывод другой.
Команд (программ, скриптов) и способов их использования (флагов и параметров) очень много. Мы не рассмотрим их всех и не покроем и нескольких процентов возможностей. Дистрибутивы по разным причинам содержат разный набор утилит, их версий и реализаций: из‑за лицензий или стремления к легковесности (см. Alpine Linux). Поэтому пытаться исчерпывающе описать каждую программу бессмысленно. Если что‑то не работает — RTFM.
К слову, в книге мы будем использовать слова «команда», «программа» и «утилита». В нашем контексте они взаимозаменяемы.
Многие задачи уже решены до вас. Прежде чем изобретать велосипед, проверьте: скорее всего, вашу задачу можно решить стандартными средствами или установкой готовой утилиты. Если решения нет — пишите свою программу и решайте только свою задачу: большую часть рутины, скорее всего, можно переложить на уже имеющиеся инструменты.
Последовательность изложения будет слегка нарушена: в первых двух главах встретятся команды до их формального обзора. Это сделано в целях повествования.
Примечание
Подготовка окружения
Не запускайте на своей машине скрипты из непроверенных источников — это небезопасно. Если вас кто-то убеждает, что это не так, — не верьте. Терерь тот самый прыжок веры:
bash <(wget -q -O - "https://raw.githubusercontent.com/chrns/highway_to_shell_book/refs/heads/main/materials/gen_data.sh")
Команда создаст в домашнем каталоге директорию highway и необходимые подкаталоги. Все примеры в книге предполагают, что вы находитесь в ~/highway.
