Терминал Linux: Основные команды

s{ "title": "Терминал Linux: Основные команды — технические детали и отличия от альтернатив", "keywords": "терминал linux, основные команды linux, синтаксис команд, разница shell vs терминал, технические спецификации bash, zsh отличия, качество код base utils, материалы gnu coreutils", "description": "Технический разбор основных команд Linux: спецификации утилит, отличия от альтернатив (Zsh, Fish), качество сборок, системные вызовы. Погружение в материалы и стандарты POSIX.", "html_content": "

Первое знакомство: что скрывается за окном терминала

Когда вы открываете терминал Linux, вы взаимодействуете не просто с текстовым интерфейсом. Перед вами — прослойка между ядром и пользователем, реализованная через эмулятор терминала. Технически это программа, которая передаёт ввод-вывод через псевдотерминал (pty), подключённый к оболочке (shell). Разные дистрибутивы используют разные эмуляторы: GNOME Terminal (VTE), Konsole (KDE), Alacritty (аппаратное ускорение). Качество рендеринга шрифтов, поддержка 24-битного цвета и escape-последовательностей — всё это влияет на ваш опыт.

Вы почувствуете разницу, когда попробуете запустить htop в терминале с поддержкой True Color и без неё. Материалы исполнения: эмуляторы на VTE (библиотека C) дают стабильный вывод, тогда как Alacritty использует прямой отрисовщик на Vulkan. Спецификации псевдотерминала: буфер ввода обычно 4096 байт, скорость передачи данных ограничена настройками stty. Это не просто \"чёрное окно\" — это полноценный драйвер вашего взаимодействия с системой.

Технические детали команд: где скрывается качество

Основные утилиты (ls, cp, mv) поставляются в составе GNU Coreutils. Их кодовая база насчитывает около 100 тысяч строк на C, с поддержкой стандарта POSIX и расширениями GNU. Разница между реализациями: в BusyBox (используется во встраиваемых системах) те же команды скомпилированы с флагами оптимизации по размеру — они теряют часть опций (например, -h в ls). Выбирая дистрибутив, вы выбираете уровень детализации вывода: в Ubuntu используется полный GNU, в Alpine — минималистичный BusyBox.

Качество сборки определяется опциями компилятора: -O2 добавляет оптимизацию скорости, -Os — размер. Для серверных задач предпочтительны сборки с аудитом (SSP, RELRO). Спецификации вызова команды: каждая утилита получает аргументы через syscall execve, и её поведение зависит от переменной окружения LC_ALL. Если вы задаёте C.UTF-8, сортировка ls изменится на алгоритмическую без учёта локали. Технические материалы: исходники можно найти на git.savannah.gnu.org, и вы сможете собрать свою версию с кастомными патчами.

Навигация по файловой системе: материалы и спецификации

Первая команда, с которой вы столкнётесь — cd. Встроенная в shell, она не исполняется как внешний процесс, а меняет текущий рабочий каталог через системный вызов chdir. Разница: в Bash cd использует стек каталогов (pushd/popd), в Zsh — ещё и параметрические пути. Технически, каждый вызов cd обновляет значение переменной PWD в окружении процесса. Если вы используете Zsh, вы получите автодополнение пути с учётом прав доступа — это качество, которого нет в стандартном Bash.

Команда ls — образец отличий. В GNU ls реализована поддержка формата long listing с цветовым выводом через опцию --color=auto. Спецификации: для каждого файла ls открывает syscall stat (или lstat для симлинков), получая информацию о inode. Качество вывода зависит от колонок терминала (tput cols). В отличие от альтернатив (exa/eza), написанных на Rust, GNU ls быстрее на миллионах файлов за счёт буферизированного чтения dentry. Но exa предлагает лучшую читаемость за счёт значков и группировки по расширениям.

Вы будете использовать pwd для проверки пути. Реализация встроенная: она просто выводит значение PWD. Внешняя версия (утилита /bin/pwd) делает syscall getcwd и возвращает реальный физический путь, без учёта follow symlinks. Разница важна, когда вы находитесь в каталоге, примонтированном через bind mount — встроенный pwd покажет одно, внешний — другое. Технические материалы: man pid_namespaces объясняет, как это работает внутри контейнеров.

Работа с файлами и каталогами: отличия в подходах

cp и mv — ключевые для копирования и перемещения. Спецификации: cp выполняет создание нового inode и копирование данных через read/write или sendfile (для ускорения в ядре). Качество кодирования: GNU cp поддерживает sparse файлы (--sparse=auto) — это важно для образов виртуальных машин. В альтернативах (rsync — для синхронизации) другая стратегия: сравнение по хэшу, дельта-копирование. Разница в материалах: cp работает на уровне блоков файла, rsync — на уровне RSYNC-алгоритма, передавая только изменённые блоки.

mv в пределах одной файловой системы работает просто: syscall rename меняет запись в каталоге (атомарная операция). Если между разными ФС — выполняется cp + unlink. Вы почувствуете задержку на больших файлах. Технические детали: поддержка mv с опцией -b для резервного копирования — качество, отсутствующее в BusyBox. Спецификации rename: операция безопасна, если целевой каталог существует и у процесса есть права на запись в родительский каталог.

Для создания каталогов используется mkdir. Реализация: явный вызов syscall mkdirat. Сборка GNU поддерживает рекурсивное создание -p с учётом umask. Качество: отказ при существующем каталоге только если не указан -p. Разница от альтернатив: в Zsh есть встроенная команда zsh/mkdir с поддержкой pattern вывода, но она не является стандартной.

  1. cp source dest — копирование с сохранением метаданных при -p (acls, selinux контексты).
  2. mv source dest — атомарно на одной ФС; для разных — делает backup целевого файла если включено --backup.
  3. mkdir -p a/b/c — создаёт всю цепочку; каждая директория создаётся с правами (rwxrwxrwx & ~umask).

Просмотр содержимого файлов: качество реализации утилит

cat — стандартная утилита для вывода. Технически: читает файл блоками по BUFSIZ (обычно 8192 байта) и пишет в stdout. Качество в GNU cat: поддержка опций -n (нумерация), -b (непустые строки), -s (сжатие пустых строк). Спецификации: cat конкатенирует множество файлов без дополнительной синхронизации — поток вывода может смешаться. В альтернативах (bat) реализована подсветка синтаксиса через синтакс-анализ на основе Sublime Text. Разница в материалах: bat требует дополнительную библиотеку для автодетекта языка, что увеличивает нагрузку на процессор до 3% против 0.1% у cat.

less — постраничный просмотр. Реализация: использует termcap/terminfo для навигации. Качество: поддержка сжатых файлов через pipe (zless). Спецификации: less читает файл полностью в память при открытии, но буферизирует вывод по экрану. Отличия: в man less — опция -R для поддержки escape-последовательностей (цвет). Для больших логов (100 ГБ) less может виснуть при загрузке. В качестве альтернативы — lv (многоязычный) или moar (на Rust, меньший расход памяти).

head и tail — для выборки строк. Head читает первые N строк, используя буферизованный ввод. Tail может работать в режиме -f (follow), ожидая данные через inotify (Linux) или цикл с перечитыванием. Технические спецификации: tail -f эффективен для файловых потоков (logrotate поддерживается через -F). Качество сборки tail в GNU Coreutils: реализация использует mmap при возможности — это ускоряет чтение до 5 раз. Разница от BusyBox: там tail без inotify, только периодический опрос.

Поиск и фильтрация данных: системные вызовы и качество

grep — поиск по шаблону. Техническая реализация: использует алгоритмы Aho-Corasick (фиксированные строки) или Boyer-Moore (регулярки). Качество в GNU grep: поддержка PCRE (через -P), захват групп, lookahead. Спецификации: grep читает файл через mmap, если размер меньше управляющей памяти. Разница от alternatives: ripgrep (rg) написан на Rust, использует SIMD для ускорения до 10 раз на UTF-8 строках. Отличия материалов: rg умеет игнорировать .gitignore по умолчанию, чего нет в grep. Для точного поиска в бинарниках лучше подходит grep -a.

wc — подсчёт строк, слов, байт. Реализация: читает файл поблочно и увеличивает счётчики. Качество: wc из GNU поддерживает опцию -m (символы, учитывая мультибайтовые юникод-строки). Спецификации: wc -c показывает точное количество байт, включая конец строки (0x0A). Для перекрёстной верификации используйте stat --format=%s. Разница от BusyBox: там нет поддержки -m, только -c и -l.

sort — сортировка строк. Использует алгоритм сортировки: при малом объёме — быстрая сортировка, при большом — внешняя сортировка с временными файлами в TMPDIR. Качество сборки: GNU sort использует до 90% памяти под буфер, если не задано -S. Спецификации: sort -u эквивалентна sort | uniq, но без pipe — быстрее. Разница от alternatives: sort из util-linux — альтернатива, но с меньшим набором опций (нет -V для версий).

Управление процессами и системной информацией

ps — список процессов. Реализация: читает /proc (procfs) через последовательность open/read на каждую папку PID. Качество: ps из procps-ng поддерживает множество выходных форматов (-o pid,pcpu,pmem,args). Спецификации: процесс с PID 0 — idle, PID 1 — init. Разница от top: top — динамический (обновляется каждые 3 секунды), htop — с цветами и мышью. Качество htop: использует curses ncurses, поддерживает древовидный режим и сигналы мышью.

kill — отправка сигнала. Технически: syscall kill(tgid, sig). Спецификации: по умолчанию SIGTERM (15), для безотлагательного — SIGKILL (9). Качество: killall (из psmisc) убивает по имени, но может задеть важные процессы. Альтернатива — pidof с последующим kill. Отличия: pkill позволяет фильтровать по владельцу (pkill -u). Для демона используйте systemctl kill.

df и du — дисковое пространство. df использует statfs syscall для каждой смонтированной ФС. Качество: df -h выводит человекочитаемые единицы, -T показывает тип ФС (ext4, xfs). du подсчитывает сумму inode-блоков через fts (файловое дерево). Спецификации: du -s --exclude=proc очень полезно для очистки диска. Разница: в alternatives (ncdu) — интерактивная навигация, но требует терминал curses.

  1. ps aux — все процессы в системе с подробностями.
  2. kill -9 PID — принудительное завершение; не гарантирует сброс данных из кэшей (риск потери).
  3. df -h — использование диска по смонтированным разделам.
  4. du -sh /home/* — размер каждого пользовательского каталога.

Сеть: технические детали и качество утилит

ping — проверка ICMP эхо. Реализация: IPPROTO_ICMP с capabilities для непривилегированного сокета. Качество: iputils-sss (патч Linux) поддерживает интервал и замер RTT с точностью до микросекунд. Спецификации: по умолчанию пакеты 56 байт + 8 байт ICMP-заголовка = 64. Отличия от fping: fping может работать в параллель с несколькими хостами. Материалы: ping -c 1 8.8.8.8 — один запрос, время ответа в миллисекундах.

curl и wget — HTTP-загрузка. curl использует libcurl — библиотека с поддержкой SSL через OpenSSL/NSS/GnuTLS. Качество: curl поддерживает HTTP/2, cookies, proxy, авторизацию. Спецификации: wget из GNU — рекурсивная загрузка (mirror), поддержка протоколов HTTP/FTP. Разница: wget не поддерживает HTTP/2, но зато собирается с без SSL для встраиваемых систем (через configure --disable-ssl). Производительность: curl использует async DNS через c-ares.

ss (socket statistics) — заменяет netstat. Использует netlink (через rtnetlink) — быстрее и точнее, чем чтение /proc/net/tcp. Качество: ss -tuln показывает все слушающие TCP/UDP порты без DNS-резолвинга (ускорение).

Добавлено: 07.05.2026