Урок 3. Сила командной строки: файлы, потоки и первый скрипт

Рейтинг: 60.1% · 14 голосов
Вводный курс для новичков: что такое Linux и открытый код, командная строка, файлы и права, устройство ОС, учебный стенд. Мягкий старт перед LPIC-1.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Урок 3. Сила командной строки: файлы, потоки и первый скрипт

Сообщение Sergey_Sysadmin »

Урок 3. Сила командной строки: файлы, потоки и первый скрипт

Графический файловый менеджер удобен, пока у тебя десять файлов. Когда их тысячи, или ты сидишь по SSH на сервере без рабочего стола, мышкой ничего не сделаешь. Этот урок снимает страх перед терминалом: научимся создавать, копировать и удалять файлы одной строкой, собирать команды в конвейеры и написать свой первый bash-скрипт. После него командная строка перестанет быть черным окошком и станет твоим главным инструментом.

Изображение

Как это работает

В Linux почти все - это файлы, а оболочка (shell, обычно bash или zsh) - это переводчик между тобой и системой. Ты пишешь команду, оболочка ее разбирает, запускает нужную программу и показывает результат. Никакой магии: команда - это просто имя программы плюс аргументы.

Главная идея Unix - маленькие программы, каждая делает одно дело хорошо. Сила в том, что их можно соединять. Одна выводит список файлов, другая считает строки, третья ищет по шаблону. Соедини их трубой (pipe), и получишь инструмент, которого не было ни у кого до тебя.

Чтобы программы соединялись, у каждой есть три стандартных потока. Поток ввода (stdin) - откуда программа читает. Поток вывода (stdout) - куда пишет результат. Поток ошибок (stderr) - куда пишет жалобы, отдельно от результата, чтобы они не смешивались. Перенаправление и конвейеры - это просто игра с тем, куда направить эти потоки: в файл, в другую программу или с экрана.

Команды и примеры

Создаем и организуем файлы. touch создает пустой файл (или обновляет дату), mkdir делает каталог, -p создает всю цепочку сразу.

Код: Выделить всё

touch notes.txt              # создать пустой файл
mkdir projects               # создать каталог
mkdir -p projects/web/css    # создать вложенные каталоги цепочкой
cp notes.txt backup.txt      # скопировать файл
cp -r projects archive       # скопировать каталог рекурсивно (-r)
mv backup.txt old_notes.txt  # переименовать (или переместить)
rm old_notes.txt             # удалить файл
rmdir projects/web/css       # удалить ПУСТОЙ каталог
Про rm -rf нужно сказать отдельно. Эта команда удаляет рекурсивно и без вопросов. Корзины в терминале нет, восстановления нет. Команда rm -rf / в неудачном варианте сносит систему.

Код: Выделить всё

rm -ri myfolder    # удалить с подтверждением каждого шага (безопаснее)
rm -rf ./build     # снести каталог build В ТЕКУЩЕЙ папке, точка важна
Шаблоны имен (globbing) подставляет оболочка ДО запуска программы. Звездочка - любой текст, знак вопроса - один символ, квадратные скобки - набор символов.

Код: Выделить всё

ls *.txt           # все файлы с расширением txt
ls report?.log     # report1.log, reportA.log, но не report10.log
ls img[0-9].png    # img0.png ... img9.png
rm temp_*          # все, что начинается с temp_  (сначала проверь через ls!)
Перенаправление потоков. Один значок больше перезаписывает файл, два - дописывают в конец, значок меньше - читает из файла, 2> ловит ошибки.

Код: Выделить всё

ls -l > files.txt          # вывод в файл (перезапись)
echo "новая строка" >> files.txt   # дописать в конец
sort < files.txt           # подать файл на вход программе
ls /нет/такого 2> err.log  # ошибки в отдельный файл
ls /etc /нет > out.log 2>&1 # и вывод, и ошибки в один файл
Конвейеры соединяют программы трубой: вывод левой идет на вход правой.

Код: Выделить всё

ls | wc -l                 # сколько файлов в каталоге (посчитать строки)
ls -l | grep ".conf"       # показать только строки со словом .conf
cat /etc/passwd | grep root  # найти строки про root
dmesg | grep -i usb | tail  # последние сообщения ядра про USB
Переменные окружения хранят настройки для программ. Свои переменные задают через равно без пробелов, а export делает их видимыми дочерним процессам.

Код: Выделить всё

echo $HOME       # домашний каталог
echo $PATH       # где система ищет программы
name="Линукс"    # своя переменная (без пробелов вокруг =)
echo "Привет, $name"
export EDITOR=nano   # передать переменную дочерним процессам
env | grep PATH      # посмотреть переменные окружения
Первый bash-скрипт. Первая строка - shebang, она говорит системе, чем запускать файл. Дальше делаем файл исполняемым через chmod +x и запускаем.

Код: Выделить всё

#!/usr/bin/env bash
echo "Привет от первого скрипта"
echo "Файлов в каталоге: $(ls | wc -l)"
echo "Запустил пользователь: $USER"

Код: Выделить всё

chmod +x hello.sh    # сделать исполняемым
./hello.sh           # запустить (точка-слеш обязательны)
Установка пакетов зависит от семейства дистрибутива. Для Debian 13 и Ubuntu 24.04 - apt, для RHEL 10 и Fedora 41+ - dnf (старый yum больше не нужен).

Код: Выделить всё

sudo apt update && sudo apt install tree   # Debian/Ubuntu
sudo dnf install tree                       # RHEL/Fedora
Частые грабли
  • Пробелы вокруг знака равно в переменных. Правильно name="value", а name = "value" оболочка поймет как команду name. Это классическая ошибка новичка.
  • rm -rf без проверки. Сначала сделай ls с тем же шаблоном, убедись, что попадают только нужные файлы, и только потом rm. Лишний пробел в rm -rf / tmp вместо /tmp - катастрофа.
  • Один значок больше затирает файл молча. Если важные данные могли быть в файле, используй два значка для дописывания.
  • Забыли ./ перед именем скрипта. Просто hello.sh оболочка ищет в каталогах PATH, а текущего каталога там нет из соображений безопасности.
  • Пробелы в именах файлов ломают конвейеры. Файл my file.txt оболочка видит как два аргумента. Бери имя в кавычки или избегай пробелов.
  • Глобы не раскрылись - значит, совпадений нет. Команда ls *.md без md-файлов выдаст ошибку, это нормально, а не поломка.
Мини-лаба
  • Создай каталог lab и зайди в него: mkdir lab затем cd lab.
  • Сделай пять файлов одной командой: touch file1.txt file2.txt file3.txt note.md readme.md.
  • Посчитай, сколько txt-файлов, и запиши результат в отчет: ls *.txt | wc -l > report.txt.
  • Найди в каталоге все markdown-файлы шаблоном: ls *.md.
  • Напиши скрипт info.sh с shebang, который печатает текущий каталог (pwd) и число файлов, сделай chmod +x info.sh и запусти ./info.sh.
  • Аккуратно убери за собой: поднимись наверх через cd .. и удали стенд с подтверждением rm -ri lab.
Контрольные вопросы
  • Чем отличается один значок больше от двух при перенаправлении вывода в файл?
  • Что делает конвейер ls | wc -l и какая программа считает строки?
  • Почему rm -rf опасна и какие два приема снижают риск удалить лишнее?
  • Что подставляет звездочка в шаблоне *.txt и кто ее раскрывает - программа или оболочка?
  • Зачем нужна строка shebield (shebang) в начале скрипта и что делает chmod +x?
👍7 ❤️1 🔥1 😄 🤔
Аватара пользователя
andy_marina
Сообщения: 1
Зарегистрирован: 16 май 2026, 17:13

Re: Урок 3. Сила командной строки: файлы, потоки и первый скрипт

Сообщение andy_marina »

А почему перед скриптом обязательно ./ ставить? Без него пишет command not found, хотя файл вот он, в этой же папке лежит
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
async_kun
Сообщения: 1
Зарегистрирован: 25 май 2026, 15:17

Re: Урок 3. Сила командной строки: файлы, потоки и первый скрипт

Сообщение async_kun »

Спасибо, наконец понял разницу > и >>. Один раз затер конфиг одним значком, теперь всегда два пишу когда дописываю
👍1 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Первое знакомство: терминал и команды
Следующая глава →
Как устроена Linux изнутри: карта системы

Все главы курса «Linux Essentials: основы Linux с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Linux Essentials: основы Linux с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость