Перейти к основному содержимому
04ФУНДАМЕНТ · ГЛАВА 04Linux и терминал$

Linux и терминал

Прочитано 0%Квизы 0/6Тренажёры 0/5Уровень 1 · Новичок

Зачем это нужно

На чемпионате «Профессионалы» рабочая машина — не Windows, а Ubuntu. Это самый популярный дистрибутив (distribution — сборка) Linux — операционной системы, на которой крутится почти весь интернет: серверы, облака, суперкомпьютеры, и даже Android внутри — это ядро Linux. Организаторы выбирают Linux не из вредности: он бесплатный, одинаковый у всех участников и в нём удобно автоматизировать проверку заданий. Так что чем раньше Ubuntu станет для тебя привычной, тем меньше сюрпризов будет на площадке.

Главный инструмент в Linux — терминал (terminal): окно, в котором ты общаешься с компьютером текстом. Выглядит как чёрный экран из фильмов про хакеров, но на деле это просто диалог: ты пишешь команду (command), нажимаешь Enter — компьютер отвечает. Никакой магии и ничего страшного: худшее, что случится у новичка, — компьютер вежливо скажет command not found. Зато многие вещи в терминале делаются в разы быстрее, чем мышкой, а некоторые — только в нём: например, запуск скриптов проверки на чемпионате.

В этой главе мы разберём десять команд, которых хватает на 90% повседневной работы в терминале, буквально по частям: что означает каждый флаг, что команда выведет в ответ и что она скажет, если ты ошибёшься. Терминал нельзя «нажать» мышкой в браузере, поэтому вместо статичных скриншотов здесь — интерактивные разборы, которые можно потрогать: кликай по частям команд, проходи самопроверки, тренируй набор руками.

Как это было
25 августа 1991 года 21-летний студент из Хельсинки Линус Торвальдс написал в новостную группу comp.os.minix, что делает свободную операционную систему — «просто хобби, ничего большого и профессионального». Из этого «хобби» вырос Linux: сегодня он работает на всех 500 мощнейших суперкомпьютерах мира, на большинстве серверов интернета и внутри каждого Android-смартфона — включая тот терминал Ubuntu, который ты сейчас изучаешь.

Окна в Ubuntu за 1 минуту

Прежде чем открывать терминал, стоит на минуту освоиться с самим рабочим столом Ubuntu (окружение GNOME) — если раньше видел только Windows или macOS, тут почти всё управление держится на одной клавише:

  • Super (клавиша с логотипом, между Ctrl и Alt) — открывает Activities Overview: обзор всех открытых окон сразу. Не отпуская мышь, начни просто печатать — заработает мгновенный поиск по приложениям, документам и контактам: нажал Super, напечатал «term» — и вот ярлык терминала, осталось нажать Enter.
  • Super+Tab — переключение между открытыми окнами, Shift держит обратный порядок. Тот же принцип, что и Alt+Tab в Windows или Cmd+Tab в macOS (уже встречались в главе про печать) — просто другая клавиша-модификатор.
  • Super+← / Super+→ — прижимает текущее окно к левой или правой половине экрана (оконный снаппинг): удобно держать задание в браузере и терминал рядом, не переключаясь. То же самое можно сделать мышью — перетащить окно за заголовок к краю экрана, пока не подсветится половина.

Сам терминал в Ubuntu открывается двумя способами: сочетанием Ctrl+Alt+T (самый быстрый) или через уже знакомый Activities Overview — Super, напечатать «Terminal», Enter.

UBUNTU · ОКНА ЗА 1 МИНУТУSuper+→окно Aокно BSuper = Activities
Super открывает обзор окон с мгновенным поиском; Super+← и Super+→ прижимают активное окно к половине экрана.

Терминал, оболочка и анатомия команды

Терминал и оболочка (shell) — не одно и то же, и путаница между ними мешает понимать, что вообще происходит. Терминал — это только окно, программа-обёртка, которая показывает текст и принимает нажатия клавиш. Настоящую работу внутри делает оболочка — отдельная программа, которая читает то, что ты напечатал, разбирает на команду и её части и решает, что с этим делать. В Ubuntu стандартная оболочка — bash (Bourne Again SHell). Поэтому «выучить терминал» на самом деле значит «выучить язык оболочки bash» — а сам терминал можно закрыть и открыть заново хоть двадцать раз, ничего не изменится.

Любая команда собирается из одних и тех же деталей: что делать, как именно и над чем. Нажми на каждую часть — под разбором появится подсказка.

Нажми на часть выражения

Уточнения вроде -l и -a называются флагами (flag): они начинаются с дефиса и меняют поведение команды, но не обязательны — без них команда работает в базовом режиме. То, над чем команда работает (в примере выше — /home/student), называется аргументом (argument).

Путь (path) — это адрес файла или каталога (directory — то же самое, что папка, просто более «системное» слово, принятое в Linux и в текстах ошибок). /home/student читается так: в корне файловой системы (root — самая верхняя точка, у которой нет родителя) есть каталог home, в нём — student. Это домашний каталог (home directory) пользователя student — место, куда система пускает его без вопросов и где хранятся его личные файлы. У домашнего каталога есть короткое имя-псевдоним: ~ (тильда).

LINUX · ФАЙЛОВАЯ СИСТЕМА/homeetcvarstudent~= /home/student
Дерево файловой системы: от корня / вниз к домашнему каталогу /home/student — у него есть короткое имя ~.

Если забыл, как работает команда, у большинства из них есть встроенная подсказка — допиши --help: например, ls --help выведет список всех флагов прямо в терминале. Более полное описание хранится в man-странице (от manual — «руководство»): man ls открывает её на весь экран, листать — стрелками, выйти — клавишей q. Это первоисточник: любой урок в интернете, включая эту главу, пересказывает именно man-страницы.

Отвечено вопросов: 0 из 4
Чем терминал отличается от оболочки (shell)?
На какие три части раскладывается команда ls -la /home/student?
Что означает символ ~ (тильда) в пути?
Чем отличаются --help и man?
Отвечено верно: 0 из 4

Навигация: pwd, ls, cd

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

pwd — где я нахожусь

pwd расшифровывается как print working directory — «напечатать рабочий каталог». Это самая простая команда в главе: без флагов, без обязательных аргументов, только один ответ — полный путь до того места, где сейчас стоит терминал.

Нажми на часть выражения

Пример вывода в свежеоткрытом терминале:

/home/student

Типичная ловушка: pwd — не про ошибку, а про невнимательность. Команда pwd project не ищет каталог project и не ругается на лишнее слово — она молча игнорирует всё, что ей передали, и печатает текущий путь как ни в чём не бывало. Многие Unix-утилиты именно так реагируют на аргументы, которые не умеют использовать: не падают, а просто их не замечают. Если результат pwd выглядит не так, как ты ожидал, — значит, ты правда не в той папке, где думал, и решает это не pwd, а следующая команда, cd.

ls — что лежит рядом

ls (list) показывает содержимое каталога. Без аргументов — содержимое текущего каталога; с аргументом-путём — содержимое каталога по этому пути.

Нажми на часть выражения

Три флага меняют вид списка настолько, что стоит разобрать их по отдельности — вот реальный вывод для каталога project с файлом README.md и подкаталогами docs и src.

Без флагов — только имена, в несколько столбцов, ничего больше:

README.md docs src

ls -l (long — «длинный формат») — по одной записи на строку: права доступа, число жёстких ссылок, владелец, группа, размер в байтах, дата изменения, имя:

total 8
-rw-r--r-- 1 student student 0 Aug 31 18:35 README.md
drwxr-xr-x 2 student student 4096 Aug 31 18:35 docs
drwxr-xr-x 2 student student 4096 Aug 31 18:35 src

Первый символ строки — тип: - значит обычный файл, d — каталог (directory). Дальше идут девять символов прав доступа тремя тройками rwx (подробно про биты rwx будет отдельная глава про файлы и права) — пока достаточно заметить, что у каталогов почти всегда есть x в каждой тройке: без него нельзя зайти внутрь, даже если он виден.

ls -a (all — «все») — добавляет к обычному списку скрытые файлы: те, чьё имя начинается с точки, вроде .bashrc. Обычный ls их прячет, чтобы не мешались, но они никуда не делись:

. .. README.md docs src

Здесь . — это сам текущий каталог, а .. — его родитель: тоже скрытые «файлы», но особые, есть в любом каталоге всегда.

ls -la — комбинация: подробный формат плюс скрытые файлы, самый информативный вид:

total 16
drwxr-xr-x 4 student student 4096 Aug 31 18:35 .
drwxr-x--- 3 student student 4096 Aug 31 18:35 ..
-rw-r--r-- 1 student student 0 Aug 31 18:35 README.md
drwxr-xr-x 2 student student 4096 Aug 31 18:35 docs
drwxr-xr-x 2 student student 4096 Aug 31 18:35 src

Дата, права и точный размер у тебя на экране будут свои — сравнивай структуру (какие строки и в каком порядке), а не конкретные цифры.

Типичная ошибка — попытка посмотреть каталог, которого не существует:

ls: cannot access 'nope': No such file or directory

cd — переместиться в другой каталог

cd (change directory) переключает текущий каталог. Путь можно указать четырьмя способами, и вперемешку они встречаются постоянно.

Нажми на часть выражения
ПУТЬ · АБСОЛЮТНЫЙ ПРОТИВ ОТНОСИТЕЛЬНОГО/homestudentprojectdocs▲ текущий каталог (pwd)/home/student/project/docsабсолютный: от корня /project/docsотносительный: от текущего места
Абсолютный путь всегда начинается от корня /; относительный — от того места, где ты сейчас (pwd).

Четыре формы пути для cd:

  • Абсолютный путь — начинается с /, отсчитывается от корня и работает из любого места: cd /home/student/project.
  • Относительный путь — без ведущего /, отсчитывается от текущего каталога: если ты в project, то cd docs заведёт в project/docs.
  • cd .. — подняться на один уровень к родителю. cd ../.. поднимает сразу на два уровня — точки можно продолжать через /.
  • cd ~ или просто cd без аргументов — вернуться в свой домашний каталог, откуда бы ты ни находился.

Типичная ошибка — опечатка в имени каталога или каталог ещё не создан:

bash: cd: nope: No such file or directory

Все четыре формы пути удобно потрогать на живом дереве: кликай по узлам — и смотри, какой cd туда ведёт из текущего места.

Кликни по любому узлу дерева — увидишь его путь и команду cd, которая туда ведёт.
Мини-квест: ты стоишь в src. Доберись в docs за одну команду.
Отвечено вопросов: 0 из 4
Что покажет ls -a, чего не покажет ls без флагов?
Что означает первый символ - или d в начале строки вывода ls -l?
Чем cd docs отличается от cd /docs?
Что сделает команда cd без аргументов вообще?
Отвечено верно: 0 из 4
Учебный терминал. Введите help, чтобы увидеть список команд.
student@pgk:~$
Как это устроено под капотом
Никакого настоящего Linux здесь нет: файловая система — обычный JS-объект в памяти браузера, где папка — это вложенный объект, а файл — строка с содержимым. Команды ls, cd, mkdir, rm и остальные — функции, которые читают и меняют этот объект, а cp -r — просто глубокое копирование куска JSON. После каждой команды проверка квеста проходит по требуемым путям и смотрит, существуют ли они в этом дереве. Перезагрузишь страницу — «диск» создастся заново с нуля, так что ломать тут можно безнаказанно.

Работа с файлами и каталогами

Пять команд, которые создают, копируют, перемещают и удаляют. С последней стоит быть особенно аккуратным — почему, разберём отдельно.

mkdir — создать каталог

mkdir (make directory) создаёт новый пустой каталог. Обычный вызов создаёт только один уровень и требует, чтобы родитель уже существовал.

Флаг -p (parents) снимает оба ограничения разом — создаёт сразу цепочку вложенных каталогов, даже если промежуточных ещё нет:

Нажми на часть выражения

После mkdir -p app/assets/images появляются сразу все три уровня:

app:
assets

app/assets:
images

app/assets/images:

Типичная ошибка — попытка создать вложенный каталог без -p, когда промежуточных ещё нет:

mkdir: cannot create directory 'app/assets/images': No such file or directory

touch — создать пустой файл

touch создаёт пустой файл (file), если его ещё нет, а если он уже есть — просто обновляет дату последнего изменения, не трогая содержимое. Аргументов можно передать сколько угодно через пробел — команда обработает каждый по очереди.

Нажми на часть выражения
Совет

Команда ничего не выводит, если всё получилось, — молчание в терминале почти всегда значит «успех», это общее правило для многих Unix-утилит.

Типичная ошибка — как и у mkdir, touch не создаёт промежуточные каталоги сама:

touch: cannot touch 'nope/file.txt': No such file or directory

cp — скопировать

cp (copy) копирует файл или каталог. Обычная форма — cp источник назначение — работает только с файлами; каталоги требуют флага -r.

Нажми на часть выражения

После cp -r src src_backup внутри src_backup оказывается точная копия содержимого src:

total 8
drwxr-xr-x 2 student student 4096 Aug 31 18:36 .
drwxr-x--- 3 student student 4096 Aug 31 18:36 ..
-rw-r--r-- 1 student student 0 Aug 31 18:36 main.py

Типичная ошибка — забыли -r при копировании каталога:

cp: -r not specified; omitting directory 'src'

mv — переместить или переименовать

mv (move) не различает «переместить» и «переименовать» — для файловой системы это одно и то же действие: изменить запись о том, где лежит файл и как называется. mv старое_имя новое_имя в той же папке — переименование. mv файл другая_папка/ — перемещение.

Пример: mv docs/notes.md docs/README.md переименовывает файл прямо внутри docs, а mv docs/README.md . — переносит тот же файл из docs в текущий каталог (. — обозначение «сюда»). А вот mv README.md . для файла, который уже лежит в текущем каталоге, ничего не переместит: источник и назначение указывают на один и тот же файл, и mv откажется, сообщив об этом ошибкой.

Типичная ошибка — источник не существует:

mv: cannot stat 'ghost.txt': No such file or directory

rm — удалить (и почему это по-настоящему опасно)

rm (remove) удаляет файлы. Обычный вызов работает только с файлами; для каталогов, как и у cp, нужен флаг -r (recursive) — удалить каталог вместе со всем содержимым, рекурсивно, то есть спускаясь во все вложенные подкаталоги.

Типичная ошибка — забыли -r при удалении каталога:

rm: cannot remove 'app_copy': Is a directory
Важно

А вот с чем нужно быть по-настоящему осторожным: в терминале нет корзины. То, что удалила rm, не отправляется во «Недавно удалённые» — оно стирается сразу, восстановить штатными средствами нельзя. Никакого диалога «вы уверены?» тоже не будет: команда молча делает ровно то, что написано.

В ТЕРМИНАЛЕ НЕТ КОРЗИНЫDelete в проводникеКорзинаможно вернутьrm report.txtсразу пропало — не вернуть
Удаление в проводнике попадает в корзину — можно вернуть. rm удаляет сразу и безвозвратно.

Самый известный способ прострелить себе ногу — rm -rf /: удалить рекурсивно (-r) и без вопросов (f — force) от самого корня файловой системы. Это буквально «сотри всё, что вообще есть в системе». К счастью, у современных версий rm встроена защита именно от этого конкретного случая — попробуй прочитать реальный ответ:

Нажми на часть выражения

Полностью: rm: it is dangerous to operate recursively on '/', за ней вторая строка — rm: use --no-preserve-root to override this failsafe («используй --no-preserve-root, чтобы отключить эту защиту»). Именно поэтому фраза заканчивается словом failsafe — «страховка на случай отказа». Дословный перевод: «rm: опасно рекурсивно оперировать над '/'».

Важно понимать границы этой страховки — она спасает только от одного, самого буквального случая: аргумента, который в точности равен /. Она не спасёт от rm -rf ~ (снесёт весь домашний каталог), от rm -rf . в неправильной папке или от команды внутри чужого скрипта, где вместо ожидаемого пути неожиданно оказалась пустая переменная — тогда rm -rf "$papka/$podpapka" при пустых $papka и $podpapka превращается ровно в rm -rf /, но уже без кавычек-подсказки и без единой пустой переменной в поле зрения. Именно так в 2016 году владелец одного хостинга случайно уничтожил данные полутора тысяч серверов одной автоматизированной командой — реальная история есть в разделе «Куда дальше» этой главы. Отсюда практическое правило: перед rm -r, а тем более перед rm -rf, дважды проверь, что стоит после неё — особенно если команда собрана из переменных или скопирована из интернета, а не написана своими руками.

Отвечено вопросов: 0 из 4
Что нужно добавить к mkdir, чтобы создать сразу три вложенных уровня: app/assets/images?
Чем rm отличается от cp и mv в вопросе флага -r?
От чего именно защищает встроенная страховка rm при аргументе /, а от чего — нет?
Почему rm не спрашивает «вы уверены?» перед удалением, в отличие от корзины в графическом интерфейсе?
Отвечено верно: 0 из 4

От проводника к терминалу: GUI и командная строка — один и тот же смысл

Если файлами до сих пор управлял мышкой — в проводнике Windows, Finder на macOS или Files (Nautilus) в GNOME/Ubuntu, — хорошая новость: команды mv, cp и mkdir не появились из ниоткуда. Это буквально то, что происходит «под капотом», когда ты переименовываешь, копируешь или перетаскиваешь файл мышью. Вот прямой мостик — проверено по официальной документации GNOME Files:

Действие мышью в GNOME FilesЧто происходит под капотом
F2 или ПКМ → «Переименовать»mv старое_имя новое_имя — переименование и есть перемещение в той же папке
Ctrl+C, затем Ctrl+Vcp — копия остаётся и в старом, и в новом месте
Ctrl+X, затем Ctrl+Vmv — оригинал переезжает, копии не остаётся
Перетащить (drag) на том же дискеmv — файловый менеджер молча перемещает
Перетащить (drag) на другой диск/флешкуcp — файловый менеджер молча копирует
Ctrl+перетащитьпринудительно cp, даже на том же диске
Shift+перетащитьпринудительно mv, даже на другой диск
Ctrl+Shift+N (неофициально)mkdir «Новая папка» — устойчиво воспроизводится в GNOME Files, но в официальной документации это сочетание не встретилось: не полагайся на него на 100%

Самое неочевидное здесь — перетаскивание: GNOME Files решает mv это или cp, глядя не на твоё намерение, а буквально на то, один это диск или разные (официальная формулировка: «move it if the destination is on the same device, or copy it if the destination is on a different device»). Поэтому перетаскивание файла с флешки на диск копирует, а между двумя папками на одном диске — переносит. Модификаторы Ctrl/Shift при перетаскивании силой переключают это поведение в обратную сторону.

Интересный факт

Переименование файла и перемещение файла в файловых системах Linux — операция одна и та же: системный вызов rename(). mv report.txt summary.txt и клик «Переименовать» → summary.txt физически делают одно и то же — меняют запись в каталоге, не трогая содержимое файла на диске. Именно поэтому переименование гигабайтного видео происходит мгновенно, а копирование того же файла — нет.

Потренируй те же самые действия — переименование, перемещение, копирование — в игрушечном файловом менеджере: перетаскивай мышью, выделяй Ctrl/Shift+кликом несколько файлов сразу, жми правой кнопкой. Журнал внизу покажет, какая команда терминала спряталась за каждым твоим действием.

Клик — выбрать один файл. Ctrl+клик — добавить к выбору. Shift+клик — выбрать диапазон. ПКМ или F2 на выбранном — переименовать. Перетащи файл(ы) в один из дисков справа.

Файлы (этот диск)
  • 📄 report.txt
  • 🖼️ photo.jpg
  • 📄 notes.txt
  • 🗜️ archive_old.zip
  • 📄 todo.txt
📁 Архив (тот же диск)

    Просто перетащи — переместит (mv). С Ctrl — скопирует (cp).

    💽 Диск D: (другой диск)

      Просто перетащи — скопирует (cp). С Shift — переместит (mv).

      Журнал команд (что происходит «под капотом»)
      Пока пусто — начни действовать: переименуй, перетащи, скопируй.

      Просмотр содержимого: cat и less

      Две команды показывают, что внутри текстового файла, но по-разному годятся для разных размеров.

      cat — вывести файл целиком

      cat (concatenate — «объединить, сцепить»; так же называется вся команда) печатает содержимое файла прямо в терминал, от начала до конца, без остановок:

      $ cat README.md
      Проект для чемпионата Профессионалы

      Если передать несколько файлов сразу — cat a.txt b.txt — они выведутся один за другим подряд, будто склеенные в один поток текста: отсюда и название команды.

      Типичная ошибка — попытка вывести не файл, а целый каталог:

      cat: src: Is a directory

      cat умеет читать только файлы; у каталога нет «содержимого» в этом смысле — посмотреть, что внутри каталога, можно только через ls.

      less — листать длинный файл постранично

      У cat есть слабое место: файл на тысячу строк вывалится в терминал целиком, и первые сотни строк улетят за верхний край экрана. less решает это иначе — показывает файл по одному экрану за раз, а листать можно клавишами:

      • Space (пробел) или f — на страницу вперёд;
      • b — на страницу назад;
      • стрелки ↑ / ↓ — на строку;
      • /слово — искать слово по тексту, n — перейти к следующему совпадению;
      • q (quit) — выйти и вернуться в обычный терминал.
      Нажми на часть выражения

      Открытая в браузере страница не может по-настоящему запустить less — он захватывает весь терминал целиком и живёт, пока ты не нажмёшь q, поэтому здесь его не потрогать интерактивно. Компенсируем это самопроверкой ниже и практикой на настоящей Ubuntu.

      Типичная ошибка — файла не существует:

      ghost.txt: No such file or directory

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

      Интересный факт

      Кстати, у названия less есть история: пейджер (pager — программа для постраничного просмотра) с похожим названием more появился раньше и умел листать только вперёд. Новую версию, которая умеет ещё и назад, шутливо назвали less — обыгрывая английскую поговорку «less is more» («меньше значит больше»). По иронии less умеет строго больше, чем more.

      Отвечено вопросов: 0 из 4
      Почему команда cat так называется?
      В чём главное неудобство cat на большом файле и как его решает less?
      Какой клавишей выходят из less обратно в терминал?
      Что сделает cat src, если src — это каталог, а не файл?
      Отвечено верно: 0 из 4

      Практикум: собери и разбери проект за 10 шагов

      Открой терминал в Ubuntu (Ctrl+Alt+T) и пройди весь путь только командами, без единого клика мышью. Каждый шаг — новая команда из этой главы.

      СочетаниеДействие
      Win, затем «Terminal»Открыть терминал

      Шаг 1. Узнай, где ты сейчас:

      pwd

      Шаг 2. Создай сразу два вложенных каталога одной командой:

      mkdir -p project/src project/docs

      Шаг 3. Перейди внутрь и проверь, что оказался там, где нужно:

      cd project
      pwd

      Шаг 4. Создай три файла одной командой — по одному в разных местах:

      touch README.md src/main.py docs/notes.md

      Шаг 5. Посмотри, что получилось, в подробном формате со скрытыми файлами:

      ls -la

      Шаг 6. Сделай резервную копию каталога src целиком:

      cp -r src src_backup

      Шаг 7. Переименуй notes.md внутри docs в README.md:

      mv docs/notes.md docs/README.md

      Шаг 8. Запиши в главный README.md одну строку и прочитай её обратно (> перенаправляет вывод команды echo в файл вместо экрана — подробно про перенаправление будет отдельная глава про файлы):

      echo "Проект для чемпионата Профессионалы" > README.md
      cat README.md

      Шаг 9. Резервная копия больше не нужна — удали её вместе с содержимым:

      rm -r src_backup

      Шаг 10. Финальная проверка — структура должна остаться чистой: README.md, docs/, src/, без src_backup:

      ls -la

      Несколько команд можно склеить в одну строку через &&: вторая выполнится, только если первая завершилась без ошибки. Например, шаги 6 и 10 можно было бы записать как cp -r src src_backup && ls -la — если копирование провалится, лишний ls просто не запустится.

      Задание: Построй дерево проекта
      • project/README.md
      • project/src/main.py
      • project/docs/README.md
      • project/src_backup — не должно существовать
      Учебный терминал. Введите help, чтобы увидеть список команд.
      student@pgk:~$
      Как это устроено под капотом
      Никакого настоящего Linux здесь нет: файловая система — обычный JS-объект в памяти браузера, где папка — это вложенный объект, а файл — строка с содержимым. Команды ls, cd, mkdir, rm и остальные — функции, которые читают и меняют этот объект, а cp -r — просто глубокое копирование куска JSON. После каждой команды проверка квеста проходит по требуемым путям и смотрит, существуют ли они в этом дереве. Перезагрузишь страницу — «диск» создастся заново с нуля, так что ломать тут можно безнаказанно.

      Типичные ошибки

      Шесть ситуаций, с которыми терминал столкнёт тебя гарантированно в первую же неделю. Каждая — с воспроизводящим примером, точным текстом (проверено вживую), переводом, причиной и починкой.

      1. Каталог уже существует

      Попытка создать каталог, который уже есть:

      mkdir src
      mkdir: cannot create directory 'src': File exists

      Перевод: «mkdir: невозможно создать каталог src: уже существует».

      Причина: каталог с этим именем в этом месте уже создан — возможно, ещё в прошлой сессии, а ты забыл.

      Как починить: если каталог и правда нужен таким, как есть, — просто ничего не делай, он уже есть. Если хотелось создать его и не упасть с ошибкой, даже если он существует, — используй mkdir -p src: с этим флагом повторное создание не считается ошибкой.

      2. Забыли -r при копировании каталога

      cp src app_copy
      cp: -r not specified; omitting directory 'src'

      Перевод: «cp: -r не указан; пропускаю каталог src».

      Причина: cp без -r копирует только файлы. Наткнувшись на каталог, она не падает с фатальной ошибкой, а просто пропускает его и продолжила бы работу с остальными аргументами, если бы они были.

      Как починить: добавить флаг — cp -r src app_copy.

      3. Забыли -r при удалении каталога

      rm app_copy
      rm: cannot remove 'app_copy': Is a directory

      Перевод: «rm: невозможно удалить app_copy: это каталог».

      Причина: обычный rm умеет удалять только файлы — это осознанное ограничение безопасности, чтобы случайно набранный rm без раздумий не снёс папку со всем содержимым.

      Как починить: добавить флаг — rm -r app_copy, и только убедившись, что внутри действительно ничего ценного.

      4. Опечатка в имени каталога у cd

      cd nope
      bash: cd: nope: No such file or directory

      Перевод: «bash: cd: nope: нет такого файла или каталога».

      Причина: каталога с именем nope не существует в текущем месте — либо опечатка, либо он ещё не создан, либо ты не в той родительской папке, откуда думал.

      Как починить: проверить точное имя через ls, проверить, в какой ты папке, через pwd, и при необходимости создать каталог через mkdir перед тем, как в него заходить.

      5. cat на каталоге вместо файла

      cat src
      cat: src: Is a directory

      Перевод: «cat: src: это каталог».

      Причина: src — не файл, а каталог; cat умеет читать только содержимое файлов.

      Как починить: если нужно посмотреть, что внутри каталога, — используй ls src вместо cat src.

      6. Ctrl+C в терминале не копирует — он прерывает программу

      Самая частая путаница у новичков: во всех остальных программах Ctrl+C копирует выделенное (см. главу про печать). В терминале — нет. Запусти что-нибудь долгое:

      ping 127.0.0.1
      PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
      64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.653 ms
      64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.109 ms
      ^C
      --- 127.0.0.1 ping statistics ---
      8 packets transmitted, 8 received, 0% packet loss, time 7154ms

      Нажми Ctrl+C — на экране появится ^C (терминал так показывает нажатие), команда ping остановится и допечатает итоговую статистику. Ничего не скопировалось: Ctrl+C в терминале означает «прервать выполняющуюся программу», а не «скопировать».

      Причина — на уровне ядра, не конкретной команды: в терминальном драйвере (termios) клавиша Ctrl+C жёстко закреплена за символом INTR (interrupt). Получив его, ядро операционной системы посылает сигнал SIGINT всей группе процессов переднего плана — той самой программе, что сейчас читает твой ввод. Это не решение автора ping или bash, а поведение самого терминального устройства, одинаковое для абсолютно любой команды в терминале:

      VINTR … Interrupt character (INTR). Send a SIGINT signal. — man7.org, termios(3)

      Ctrl+C В ТЕРМИНАЛЕ — НЕ КОПИРОВАТЬCtrl+Cне буфер обменаSIGINTping 127.0.0.1^C процесс остановленсигнал прерывания жёстко закреплён за этой клавишей в драйвере терминала
      Ctrl+C — не буфер обмена: клавиша посылает сигнал SIGINT работающей программе, и та останавливается.

      Как копировать и вставлять текст в самом терминале — по системам:

      ОС / терминалКопироватьВставитьЧто делает голый Ctrl+C
      Ubuntu, GNOME TerminalCtrl+Shift+CCtrl+Shift+VВсегда SIGINT — прерывает программу, копировать им нельзя вообще
      Windows TerminalCtrl+C — «умный»: копирует, если есть выделениеCtrl+VЕсли выделения нет — ведёт себя как обычный SIGINT
      macOS Terminal.app / iTerm2Cmd+CCmd+VCtrl+C свой, отдельный от Cmd+C — всегда SIGINT

      Windows Terminal — единственный из трёх, где Ctrl+C иногда всё-таки копирует: по умолчанию за ним закреплено действие copy, которое копирует выделенный текст, если он есть, а если выделения нет — пропускает нажатие дальше, в саму программу, как обычный SIGINT (официально: learn.microsoft.com/windows/terminal/customize-settings/actions, действие copy). До того как это стало поведением по умолчанию, авторы Windows Terminal отдельно обсуждали именно эту путаницу — issue microsoft/terminal#2285 «Ctrl C, when text is highlighted, should copy not cancel». GNOME Terminal на Ubuntu пошёл другим путём — официальная документация прямо говорит: «The standard keyboard shortcuts, such as Ctrl+C, cannot be used to copy and paste text» — обычный Ctrl+C там не копирует вообще никогда, только Ctrl+Shift+C.

      Как починить (точнее — как не пугаться): если случайно прервал что-то нужное — просто запусти команду заново. Если хотел скопировать вывод терминала — выдели его мышью (тройной клик по строке или протяжка, см. главу про печать) и используй сочетание из таблицы выше для своей системы.

      Отвечено вопросов: 0 из 5
      Чем отличается поведение cp и rm без флага -r на каталоге?
      mkdir src выдал File exists. Что это означает и что делать?
      При bash: cd: nope: No such file or directory какие две команды помогут понять, что пошло не так?
      Почему у cat src нет способа «на всякий случай» показать хоть что-то, как это иногда бывает у других команд?
      Почему Ctrl+C в терминале не копирует текст (в отличие от почти всех остальных программ)?
      Отвечено верно: 0 из 5

      Слова главы

      terminal
      1 / 8

      Потренируйся печатать

      Сначала команда, которую наберёшь чаще всего:

      Цель: скорость ≥ 100 зн/мин, точность ≥ 90%

      mkdir -p project/src project/docs
      клавиша ``клавиша 11клавиша 22клавиша 33клавиша 44клавиша 55клавиша 66клавиша 77клавиша 88клавиша 99клавиша 00клавиша --клавиша ==клавиша ⌫клавиша TabTabклавиша QQклавиша WWклавиша EEклавиша RRклавиша TTклавиша YYклавиша UUклавиша IIклавиша OOклавиша PPклавиша [[клавиша ]]клавиша \\клавиша Caps LockCaps Lockклавиша AAклавиша SSклавиша DDклавиша FFклавиша GGклавиша HHклавиша JJклавиша KKклавиша LLклавиша ;;клавиша ''клавиша EnterEnterклавиша ShiftShiftклавиша ZZклавиша XXклавиша CCклавиша VVклавиша BBклавиша NNклавиша MMклавиша ,,клавиша ..клавиша //клавиша ShiftShiftклавиша CtrlCtrlклавиша WinWinклавиша AltAltклавиша ПробелПробелклавиша AltAltклавиша WinWinклавиша MenuMenuклавиша CtrlCtrl
      следующая: M — указательный правой руки

      Теперь цепочка из двух команд через && — резервное копирование и его же удаление:

      Цель: скорость ≥ 110 зн/мин, точность ≥ 90%

      cp -r src src_backup && rm -r src_backup
      CMD Challenge
      Задачки по командной строке прямо в браузере: терминал уже открыт, ставить ничего не нужно.

      Команды и флаги главы

      Шпаргалка по всем командам и флагам, которые встретились. Вернись сюда, если забудешь, что делает конкретная команда.

      КомандаФлагЧто делаетПример
      pwdпоказать полный путь к текущему каталогуpwd
      lsбез флаговпоказать имена файлов и каталогов в столбикls
      ls-lподробный формат: права, владелец, размер, датаls -l
      ls-aпоказать и скрытые файлы (начинающиеся с точки)ls -a
      ls-laподробный формат и скрытые файлы вместеls -la
      cdперейти в каталог по абсолютному или относительному путиcd project
      cdподняться к родительскому каталогуcd ..
      cdвернуться в домашний каталогcd ~ или cd
      mkdirбез флаговсоздать один каталог (родитель должен существовать)mkdir project
      mkdir-pсоздать сразу цепочку вложенных каталоговmkdir -p app/assets/images
      touchсоздать пустой файл или обновить его дату измененияtouch notes.txt
      cpбез флаговскопировать файлcp a.txt b.txt
      cp-rскопировать каталог рекурсивно, вместе с содержимымcp -r src src_backup
      mvпереместить файл или каталог, либо переименовать на местеmv old.txt new.txt
      rmбез флаговудалить файл безвозвратноrm notes.txt
      rm-rудалить каталог рекурсивно, вместе с содержимым — ОПАСНОrm -r src_backup
      catвывести содержимое файла целиком в терминалcat README.md
      lessлистать файл постранично: Space/b, стрелки, /поиск, q — выходless numbers.txt
      --helpкраткая справка по флагам любой командыls --help
      manполное руководство по команде на весь экранman ls
      Углубиться

      Не все команды одинаковы: встроенные и внешние. cd и pwd — не отдельные программы, а builtin-команды (встроенные), они живут прямо внутри самой оболочки bash. А вот ls, mkdir, cp, mv, rm, cat — обычные исполняемые файлы где-то на диске, например /usr/bin/ls; bash находит их, просматривая список папок в переменной окружения $PATH. Проверить разницу можно командой type: type cd ответит cd is a shell builtin. С ls есть нюанс: стандартный ~/.bashrc в Ubuntu заводит алиас ls='ls --color=auto', поэтому type ls сначала расскажет про алиас, а настоящий путь к программе покажет type -P ls/usr/bin/ls (или type -a ls, который выведет обе строки сразу). У cd есть веская причина быть builtin: обычная программа получает свою собственную временную рабочую область (процесс) и не может дотянуться и поменять «текущий каталог» у оболочки, которая её запустила, — она просто исчезнет, как только закончит работу, а оболочка останется на прежнем месте. Сменить каталог оболочки может только код, который выполняется внутри самой оболочки, — то есть только builtin.

      Права доступа rwx — отдельная большая тема. В выводе ls -l строка вроде drwxr-xr-x — это тип объекта и три тройки прав: для владельца, для группы и для всех остальных, каждая из трёх букв r (read — читать), w (write — писать), x (execute — исполнять для файла, входить внутрь для каталога). Разобрать это подробно, включая команду chmod, которая эти права меняет, — задача отдельной главы про файлы и права доступа.

      История less. Пейджер (pager) — не изобретение Linux, первые появились ещё в 1970-х на Unix. Первым был more, но он умел листать только вперёд; less дописали позже с полноценной прокруткой в обе стороны и назвали в шутку наоборот — «меньше значит больше».

      Дальше по теме:

      • GNU Bash Manual — Bourne Shell Builtins — официальное руководство bash: полное описание cd и других встроенных команд, включая флаги, о которых мы не говорили
      • Filesystem Hierarchy Standard — что означают каталоги верхнего уровня вроде /home, /etc, /usr и зачем файловая система Linux устроена именно так

      → Отдельная тема: Регулярные выражения для grep — как искать в файлах не точный текст, а шаблон: классы символов, якоря и квантификаторы с нуля.

      Куда дальше: проверенные ресурсы

      Челлендж ⭐

      В каталоге reports лежат три файла с отчётами и один посторонний: jan.txt, feb.txt, mar.txt, notes.md. Все они уже созданы — тебе нужно организовать их без единой ошибки, только командами из этой главы.

      Ступень 1. Создай внутри reports подкаталог archive и перенеси туда все три .txt-файла, используя mv для каждого файла по отдельности (три отдельные команды mv). notes.md должен остаться на месте, в reports. Проверь результат через ls reports и ls reports/archive.

      Ступень 2 ⭐. Три отдельных mv — не проблема для трёх файлов, но что если бы их было триста? Есть способ переместить сразу все файлы с расширением .txt одной командой, не называя ни одного из них по имени. Специальный символ подстановки (wildcard) * заменяет собой «что угодно» в имени файла. Разберись сам: что означает *.txt и как его применить к mv. Подсказка спрятана в самом вопросе.

      Решение (сначала попробуй сам)

      Ступень 1 (создание файлов для тренировки и перенос по одному):

      mkdir reports
      touch reports/jan.txt reports/feb.txt reports/mar.txt reports/notes.md
      mkdir reports/archive
      mv reports/jan.txt reports/archive/
      mv reports/feb.txt reports/archive/
      mv reports/mar.txt reports/archive/

      Ступень 2 ⭐:

      mv reports/*.txt reports/archive/

      * — это подстановка имени файла (wildcard), которую разворачивает сама оболочка bash ещё до того, как mv вообще увидит команду: *.txt превращается в список всех файлов каталога, чьё имя заканчивается на .txt — в нашем случае в jan.txt feb.txt mar.txt. Файл notes.md под шаблон не попадает и остаётся на месте. По сути, mv reports/*.txt reports/archive/ — это ровно те же три команды из ступени 1, просто bash сам подставил список файлов вместо того, чтобы перечислять их руками.

      Сводная проверка по всей главе: 8 вопросов, 5:00 на всё, без подсказок по ходу. Вопросы показываются по одному, ответ изменить нельзя. Если время выйдет — экзамен завершится с тем, что успел ответить. Пересдавать можно сколько угодно раз.

      Что должен уметь

      • Объяснять разницу между терминалом и оболочкой (shell) и почему в Ubuntu это конкретно bash.
      • Разбирать любую команду на три части: команда, флаги, аргумент — на примере ls -la /home/student.
      • Перемещаться по файловой системе командами pwd, ls, cd, используя абсолютные и относительные пути, cd .. и cd ~.
      • Показывать содержимое каталога тремя способами — ls, ls -l, ls -a, ls -la — и объяснять разницу между ними.
      • Создавать структуру каталогов и файлов командами mkdir (в том числе с -p) и touch.
      • Копировать и перемещать файлы и целые каталоги через cp-r для каталогов) и mv.
      • Формулировать, чем rm по-настоящему опасна, что защищает и чего не защищает страховка от rm -rf /, и проверять команду перед запуском.
      • Выводить содержимое файла через cat и объяснять, чем less лучше подходит для длинных файлов.
      • Узнавать по точному тексту сообщения шесть типичных ошибок этой главы и знать, как каждую починить.
      Интересный факт

      В учебном терминале этой главы спрятаны пасхалки из настоящего Linux: попробуй набрать sl, cowsay Привет, fortune, neofetch, figlet PGK, matrix — и попроси что-нибудь у sudo.

      Комментарии

      Комментарии появятся после настройки. Нужен аккаунт GitHub — вход прямо в виджете выше.