Linux и терминал
Зачем это нужно
На чемпионате «Профессионалы» рабочая машина — не Windows, а Ubuntu. Это самый популярный дистрибутив (distribution — сборка) Linux — операционной системы, на которой крутится почти весь интернет: серверы, облака, суперкомпьютеры, и даже Android внутри — это ядро Linux. Организаторы выбирают Linux не из вредности: он бесплатный, одинаковый у всех участников и в нём удобно автоматизировать проверку заданий. Так что чем раньше Ubuntu станет для тебя привычной, тем меньше сюрпризов будет на площадке.
Главный инструмент в Linux — терминал (terminal): окно, в котором ты общаешься с компьютером текстом. Выглядит как чёрный экран из фильмов про хакеров, но на деле это просто диалог: ты пишешь команду (command), нажимаешь Enter — компьютер отвечает. Никакой магии и ничего страшного: худшее, что случится у новичка, — компьютер вежливо скажет command not found. Зато многие вещи в терминале делаются в разы быстрее, чем мышкой, а некоторые — только в нём: например, запуск скриптов проверки на чемпионате.
В этой главе мы разберём десять команд, которых хватает на 90% повседневной работы в терминале, буквально по частям: что означает каждый флаг, что команда выведет в ответ и что она скажет, если ты ошибёшься. Терминал нельзя «нажать» мышкой в браузере, поэтому вместо статичных скриншотов здесь — интерактивные разборы, которые можно потрогать: кликай по частям команд, проходи самопроверки, тренируй набор руками.
- Зачем это нужно
- Окна в Ubuntu за 1 минуту
- Терминал, оболочка и анатомия команды
- Навигация: pwd, ls, cd
- Работа с файлами и каталогами
- От проводника к терминалу: GUI и командная строка — один и тот же смысл
- Просмотр содержимого:
catиless - Практикум: собери и разбери проект за 10 шагов
- Типичные ошибки
- Слова главы
- Потренируйся печатать
- Команды и флаги главы
- Куда дальше: проверенные ресурсы
- Челлендж ⭐
- Что должен уметь
Как это было
Окна в 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.
Терминал, оболочка и анатомия команды
Терминал и оболочка (shell) — не одно и то же, и путаница между ними мешает понимать, что вообще происходит. Терминал — это только окно, программа-обёртка, которая показывает текст и принимает нажатия клавиш. Настоящую работу внутри делает оболочка — отдельная программа, которая читает то, что ты напечатал, разбирает на команду и её части и решает, что с этим делать. В Ubuntu стандартная оболочка — bash (Bourne Again SHell). Поэтому «выучить терминал» на самом деле значит «выучить язык оболочки bash» — а сам терминал можно закрыть и открыть заново хоть двадцать раз, ничего не изменится.
Любая команда собирается из одних и тех же деталей: что делать, как именно и над чем. Нажми на каждую часть — под разбором появится подсказка.
Уточнения вроде -l и -a называются флагами (flag): они начинаются с дефиса и меняют поведение команды, но не обязательны — без них команда работает в базовом режиме. То, над чем команда работает (в примере выше — /home/student), называется аргументом (argument).
Путь (path) — это адрес файла или каталога (directory — то же самое, что папка, просто более «системное» слово, принятое в Linux и в текстах ошибок). /home/student читается так: в корне файловой системы (root — самая верхняя точка, у которой нет родителя) есть каталог home, в нём — student. Это домашний каталог (home directory) пользователя student — место, куда система пускает его без вопросов и где хранятся его личные файлы. У домашнего каталога есть короткое имя-псевдоним: ~ (тильда).
Если забыл, как работает команда, у большинства из них есть встроенная подсказка — допиши --help: например, ls --help выведет список всех флагов прямо в терминале. Более полное описание хранится в man-странице (от manual — «руководство»): man ls открывает её на весь экран, листать — стрелками, выйти — клавишей q. Это первоисточник: любой урок в интернете, включая эту главу, пересказывает именно man-страницы.
Навигация: 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) переключает текущий каталог. Путь можно указать четырьмя способами, и вперемешку они встречаются постоянно.
Четыре формы пути для cd:
- Абсолютный путь — начинается с
/, отсчитывается от корня и работает из любого места:cd /home/student/project. - Относительный путь — без ведущего
/, отсчитывается от текущего каталога: если ты вproject, тоcd docsзаведёт вproject/docs. cd ..— подняться на один уровень к родителю.cd ../..поднимает сразу на два уровня — точки можно продолжать через/.cd ~или простоcdбез аргументов — вернуться в свой домашний каталог, откуда бы ты ни находился.
Типичная ошибка — опечатка в имени каталога или каталог ещё не создан:
bash: cd: nope: No such file or directory
Все четыре формы пути удобно потрогать на живом дереве: кликай по узлам — и смотри, какой cd туда ведёт из текущего места.
src. Доберись в docs за одну команду.Как это устроено под капотом
Работа с файлами и каталогами
Пять команд, которые создают, копируют, перемещают и удаляют. С последней стоит быть особенно аккуратным — почему, разберём отдельно.
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, не отправляется во «Недавно удалённые» — оно стирается сразу, восстановить штатными средствами нельзя. Никакого диалога «вы уверены?» тоже не будет: команда молча делает ровно то, что написано.
Самый известный способ прострелить себе ногу — 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, дважды проверь, что стоит после неё — особенно если команда собрана из переменных или скопирована из интернета, а не написана своими руками.
От проводника к терминалу: GUI и командная строка — один и тот же смысл
Если файлами до сих пор управлял мышкой — в проводнике Windows, Finder на macOS или Files (Nautilus) в GNOME/Ubuntu, — хорошая новость: команды mv, cp и mkdir не появились из ниоткуда. Это буквально то, что происходит «под капотом», когда ты переименовываешь, копируешь или перетаскиваешь файл мышью. Вот прямой мостик — проверено по официальной документации GNOME Files:
| Действие мышью в GNOME Files | Что происходит под капотом |
|---|---|
| F2 или ПКМ → «Переименовать» | mv старое_имя новое_имя — переименование и есть перемещение в той же папке |
| Ctrl+C, затем Ctrl+V | cp — копия остаётся и в старом, и в новом месте |
| Ctrl+X, затем Ctrl+V | mv — оригинал переезжает, копии не остаётся |
| Перетащить (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).
Просто перетащи — скопирует (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.
Практикум: собери и разбери проект за 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 — не должно существовать
Как это устроено под капотом
Типичные ошибки
Шесть ситуаций, с которыми терминал столкнёт тебя гарантированно в первую же неделю. Каждая — с воспроизводящим примером, точным текстом (проверено вживую), переводом, причиной и починкой.
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 |
|---|---|---|---|
| Ubuntu, GNOME Terminal | Ctrl+Shift+C | Ctrl+Shift+V | Всегда SIGINT — прерывает программу, копировать им нельзя вообще |
| Windows Terminal | Ctrl+C — «умный»: копирует, если есть выделение | Ctrl+V | Если выделения нет — ведёт себя как обычный SIGINT |
| macOS Terminal.app / iTerm2 | Cmd+C | Cmd+V | Ctrl+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.
Как починить (точнее — как не пугаться): если случайно прервал что-то нужное — просто запусти команду заново. Если хотел скопировать вывод терминала — выдели его мышью (тройной клик по строке или протяжка, см. главу про печать) и используй сочетание из таблицы выше для своей системы.
Слова главы
Потренируйся печатать
Сначала команда, которую наберёшь чаще всего:
Цель: скорость ≥ 100 зн/мин, точность ≥ 90%
mkdir -p project/src project/docs
Теперь цепочка из двух команд через && — резервное копирование и его же удаление:
Цель: скорость ≥ 110 зн/мин, точность ≥ 90%
cp -r src src_backup && rm -r src_backup
Команды и флаги главы
Шпаргалка по всем командам и флагам, которые встретились. Вернись сюда, если забудешь, что делает конкретная команда.
| Команда | Флаг | Что делает | Пример |
|---|---|---|---|
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 — как искать в файлах не точный текст, а шаблон: классы символов, якоря и квантификаторы с нуля.
Куда дальше: проверенные ресурсы
-
Selectel — основные команды Linux терминала с примерами — открывай, если хочется того же материала, но одним длинным читаемым текстом с примерами команд подряд, без интерактива.
-
Cloud.ru — 15 основных команд Linux для новичков — открывай, чтобы увидеть, какие команды идут следующими после этой главы: chmod, ps, top и другие, с которыми предстоит познакомиться позже.
-
Видеоурок: терминал Linux — команды ls, rm, mkdir, pwd, cd, echo — открывай, если проще воспринимать на слух и глазами, чем текстом: те же команды, но с живым терминалом на экране.
-
Хабр — история массового удаления данных командой rm -rf — открывай, чтобы увидеть не выдуманную страшилку, а реальный случай: как пустая переменная в скрипте превратила безобидную с виду команду в
rm -rf /и стоила полутора тысяч серверов. -
Ubuntu — The Linux command line for beginners — официальный учебник Ubuntu на английском: история командной строки, устройство файловой системы и практика с нуля.
-
man-страница ls — полное описание ls со всеми флагами, не только теми тремя, что разобраны в этой главе: так выглядит настоящая документация Linux.
-
Видео и материалы сообщества — ниже — ролики по теме и ссылки от студентов и преподавателей смотри в самом низу страницы.
Челлендж ⭐
В каталоге 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 — вход прямо в виджете выше.