мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
notes:howlinuxworks:vol2 [2026/05/12 17:17] – создано radi0devnotes:howlinuxworks:vol2 [2026/05/12 18:15] (текущий) radi0dev
Строка 2: Строка 2:
  
 ===== 2.1 Оболочка Bourne Shell (bash): /bin/sh ===== ===== 2.1 Оболочка Bourne Shell (bash): /bin/sh =====
 +
 +Оболочка (**shell**) - одна из самых важных частей системы Unix. Это программа, выполняющая команды, которые пользователи передает в терминал. Эти команды могут быть другими программами или встроенными функциями оболочки. Оболочка - это еще и среда программирования. Программисты Unix часто разбивают типичные задачи на более мелкие компоненты и применяют оболочку для управления ими.
 +
 +Существует множество различных оболочек Unix (bash, zsh, fish...), но все они - производные от оболочки Bourne shell (/bin/sh), стандартной оболочки, разработанной в компании Bell Labs для ранних версий Unix. Любая система Unix требует ту или иную версию Bourne
 +shell для корректной работы. 
 +
 +Система Linux использует расширенную версию оболочки Bourne под названием bash, или Bourne-again. Оболочка bash - это оболочка по умолчанию в большинстве дистрибутивов Linux, и каталог /bin/sh обычно указывает (через линк) на bash в системе Linux.
 +
 +===== 2.3 Основные команды =====
 +
 +==== ls ====
 +
 +Перечисляет содержимое каталога.
 +<code bash>
 +ls -l  # подробный список
 +</code>
 +
 +==== cp ====
 +
 +Копирует файлы.
 +<code bash>
 +cp file1 file2
 +</code>
 +
 +==== mv ====
 +
 +Переименовывает или перемещает файлы.
 +<code bash>
 +mv file1 file2
 +</code>
 +
 +==== touch ====
 +
 +Создает файл или обновляет его временную метку.
 +<code bash>
 +touch file
 +</code>
 +
 +==== rm ====
 +
 +Удаляет файл (без возможности восстановления).
 +<code bash>
 +rm file
 +</code>
 +
 +==== echo ====
 +
 +Выводит аргументы в стандартный вывод.
 +<code bash>
 +echo Hello again.
 +</code>
 +
 +===== 2.4 Перемещение по каталогам =====
 +
 +Пути в linux начинаются с / - корневого каталога (**root directory**).
 +
 +. - означает текущий каталог.
 +
 +.. означает родительский для текущего каталога каталог.
 +
 +Пусть начинающийся с / называют **абсолютным путем**. Пусть, идущий не от / (а например от . или ..) называют **относительным путем**.
 +
 +==== cd ====
 +
 +Изменяет текущий рабочий каталог. Без аргумента возвращает в домашний каталог.
 +cd dir  # перейти в каталог
 +cd      # в домашний каталог
 +
 +==== mkdir ====
 +
 +Создает новый каталог.
 +<code bash>
 +mkdir dir
 +</code>
 +
 +==== rmdir ====
 +
 +Удаляет пустой каталог.
 +<code bash>
 +rmdir dir
 +rm -r dir  # удалить каталог со содержимым (осторожно!)
 +</code>
 +
 +==== Wildcards (шаблоны поиска) ====
 +
 +Символы расширения имен файлов:
 +
 +''*'' - любое количество символов
 +
 +''?'' - ровно один символ
 +
 +Заключить в одинарные кавычки для буквального вывода
 +
 +<code bash>
 +echo *       # все файлы
 +echo at*     # начинаются на 'at'
 +echo *at     # заканчиваются на 'at'
 +echo b?at    # boat, brat и т.д.
 +echo '*'     # выведет звездочку
 +</code>
 +
 +===== 2.5 Команды среднего уровня =====
 +
 +==== grep ====
 +
 +Выводит строки, соответствующие выражению. Поддерживает регулярные выражения.
 +<code bash>
 +grep root /etc/passwd        # поиск 'root'
 +grep -i pattern file            # без учета регистра
 +grep -v pattern file            # инвертированный поиск
 +grep root /etc/               # поиск в нескольких файлах
 +</code>
 +
 +==== less ====
 +
 +Просмотр больших файлов постранично. Пробел - вперед, b - назад, q - выход. Поиск: /word (вперед), ?word (назад), n - следующее совпадение.
 +<code bash>
 +less /usr/share/dict/words
 +grep ie /usr/share/dict/words | less
 +</code>
 +
 +==== pwd ====
 +
 +Выводит текущий рабочий каталог.
 +<code bash>
 +pwd
 +pwd -P  # истинный путь (без symlinks)
 +</code>
 +
 +==== diff ====
 +
 +Показывает различия между двумя файлами.
 +<code bash>
 +diff file1 file2
 +diff -u file1 file2  # унифицированный формат
 +</code>
 +
 +==== file ====
 +
 +Определяет тип файла.
 +<code bash>
 +file file
 +</code>
 +
 +==== find и locate ====
 +
 +find - поиск в реальном времени. locate - поиск по индексу (быстрее).
 +<code bash>
 +find dir -name file -print  # с кавычками для шаблонов: find dir -name '*pattern*'
 +locate file
 +</code>
 +
 +==== head и tail ====
 +
 +Просмотр начала/конца файла (по умолчанию 10 строк).
 +<code bash>
 +head /etc/passwd       # первые 10 строк
 +tail /etc/passwd       # последние 10 строк
 +head -5 /etc/passwd    # первые 5 строк
 +tail +5 /etc/passwd    # со строки 5
 +</code>
 +
 +==== sort ====
 +
 +Сортировка строк в алфавитно-цифровом порядке. -n для числовой сортировки.
 +<code bash>
 +sort file
 +sort -n file  # числовой порядок*
 +</code>
 +
 +==== passwd ====
 +Изменяет пароль пользователя. Запросит старый пароль и дважды новый.
 +<code bash>
 +passwd
 +</code>
 +
 +==== chsh ====
 +Изменяет оболочку пользователя (zsh, ksh, tcsh и т.д.).
 +<code bash>
 +chsh
 +</code>
 +
 +===== 2.7 Файлы с точками (дот-файлы) =====
 +
 +Скрытые файлы, начинающиеся с точки (.). Не отображаются без параметра -a. Примеры: .bashrc, .login, .ssh.
 +<code bash>
 +ls -a          # показать дот-файлы
 +ls             # скрыты дот-файлы
 +.??*           # шаблон для дот-файлов (без . и ..)
 +</code>
 +
 +===== 2.8 Переменные окружения и оболочки =====
 +
 +==== Переменные оболочки ====
 +Временные переменные для хранения текстовых значений.
 +<code bash>
 +STUFF=blah      # присвоение (без пробелов!)
 +echo $STUFF     # обращение к переменной
 +</code>
 +
 +==== Переменные окружения ====
 +
 +Передаются всем дочерним процессам. Создаются командой export.
 +<code bash>
 +STUFF=blah
 +export STUFF    # переменная окружения
 +</code>
 +
 +===== 2.9 PATH =====
 +
 +Специальная переменная окружения - список каталогов для поиска команд (разделены двоеточием).
 +<code bash>
 +echo $PATH                          # показать PATH
 +PATH=dir:$PATH                      # добавить в начало
 +PATH=$PATH:dir                      # добавить в конец
 +</code>
 +
 +===== 2.10 Специальные символы =====
 +
 +Общепринятые названия специальных символов, используемых в Linux и Unix.
 +
 +^ Символ ^ Название ^ Значение ^
 +| ''*'' | Звездочка (star, asterisk) | Регулярное выражение, символ шаблона |
 +| ''.'' | Точка (dot) | Текущий каталог, разделитель имени файла/хоста |
 +| ''!'' | Восклицательный знак (bang) | Отрицание, история команд |
 +| ''|'' | Вертикальная черта (pipe) | Конвейер (канал) для команд |
 +| ''/'' | Косая черта (slash) | Разделитель каталогов, команда поиска |
 +| ''\'' | Обратная косая черта (backslash) | Литералы, макросы (но НЕ каталоги) |
 +| ''$'' | Доллар (dollar) | Переменные, конец строки |
 +| ''''' | Одинарные кавычки (tick, quote) | Не интерпретируемые как шаблоны литеральные строки |
 +| ''`'' | Обратный апостроф (backtick, backquote) | Подстановка команд |
 +| ''"'' | Двойные кавычки (double quote) | Частично интерпретируемые строки (полулитеральные) |
 +| ''^'' | Карет (caret) | Отрицание, начало строки |
 +| ''~'' | Тильда (tilda, squiggle) | Отрицание, ярлык каталога |
 +| ''#'' | Октоторп (hash, sharp, pound) | Комментарии, препроцессор, подстановка |
 +| ''[ ]'' | Квадратные скобки (square brackets) | Диапазоны |
 +| ''{ }'' | Фигурные скобки (curly brackets, braces) | Блоки выражений, диапазоны |
 +| ''_'' | Нижнее подчеркивание (underscore, under) | Заменитель пробела в именах |
 +
 +===== 2.11 Редактирование в командной строке =====
 +
 +Клавиши со стрелками работают для редактирования, но лучше использовать сочетания управляющих клавиш (Ctrl).
 +
 +^ Сочетание клавиш ^ Действие ^
 +| Ctrl+B | Переместить курсор влево |
 +| Ctrl+F | Переместить курсор вправо |
 +| Ctrl+P | Просмотреть предыдущую команду |
 +| Ctrl+N | Просмотреть следующую команду |
 +| Ctrl+A | Переместить курсор в начало строки |
 +| Ctrl+E | Переместить курсор в конец строки |
 +| Ctrl+W | Стереть предыдущее слово |
 +| Ctrl+U | Стереть от курсора до начала строки |
 +| Ctrl+K | Стереть от курсора до конца строки |
 +| Ctrl+Y | Вставить стертый текст |
 +
 +===== 2.13 Онлайн-поддержка =====
 +
 +Страницы руководства (**man pages**) - основной источник документации.
 +
 +Просмотр справки для команды:
 +<code bash>
 +man ls
 +</code>
 +
 +Поиск по ключевому слову:
 +<code bash>
 +man -k keyword
 +# Пример: man -k sort
 +</code>
 +
 +**Разделы руководства:**
 +
 +^ Раздел ^ Описание ^
 +| 1 | Пользовательские команды |
 +| 2 | Системные вызовы |
 +| 3 | Библиотеки программирования Unix |
 +| 4 | Интерфейсы устройств и драйверы |
 +| 5 | Файлы конфигурации системы |
 +| 6 | Игры |
 +| 7 | Форматы файлов, соглашения, кодировки |
 +| 8 | Системные команды и серверы |
 +
 +Просмотр определённого раздела:
 +<code bash>
 +man 5 passwd
 +</code>
 +
 +**Дополнительная справка:**
 +  * **--help** или **-h** - краткая справка для команды
 +  * **info command** - документация формата GNU info
 +  * **/usr/share/doc** - документация пакетов
 +
 +===== 2.14 Ввод и вывод командной оболочки =====
 +
 +==== Перенаправление стандартного вывода ====
 +
 +Отправить вывод в файл (перезаписать):
 +<code bash>
 +command > file
 +</code>
 +
 +Добавить вывод в конец файла:
 +<code bash>
 +command >> file
 +</code>
 +
 +Конвейер (pipe) - отправить вывод одной команды в другую:
 +<code bash>
 +head /proc/cpuinfo | tr a-z A-Z
 +</code>
 +
 +==== Стандартная ошибка (stderr) ====
 +
 +Перенаправить ошибку в файл:
 +<code bash>
 +ls /fffffffff > f 2> e
 +</code>
 +
 +Перенаправить ошибку в того же места, что и стандартный вывод:
 +<code bash>
 +ls /fffffffff > f 2>&1
 +</code>
 +
 +Идентификаторы потоков: **1** = stdout (по умолчанию), **2** = stderr.
 +
 +==== Перенаправление ввода ====
 +
 +Направить файл на стандартный ввод:
 +<code bash>
 +head < /proc/cpuinfo
 +</code>
 +
 +**Примечание:** большинство команд Unix принимают имена файлов как аргументы, поэтому такое перенаправление редко используется.
 +
 +===== 2.16 Перечисление процессов и управление ими =====
 +
 +**Процесс** - запущенная программа с уникальным числовым идентификатором (**PID**).
 +
 +Просмотр процессов:
 +<code bash>
 +ps
 +</code>
 +
 +Основные поля вывода:
 +
 +^ Поле ^ Описание ^
 +| PID | Идентификатор процесса |
 +| TTY | Терминальное устройство |
 +| STAT | Состояние (S=sleeping, R=running) |
 +| TIME | Процессорное время (мин:сек) |
 +| COMMAND | Команда запуска |
 +
 +==== Параметры команды ps ====
 +
 +  * **ps x** - ваши процессы
 +  * **ps ax** - все процессы в системе
 +  * **ps u** - подробная информация
 +  * **ps w** - полные имена команд
 +  * **ps aux** - комбинация параметров
 +
 +Проверка конкретного процесса:
 +<code bash>
 +ps $$ # Текущая оболочка
 +</code>
 +
 +==== Завершение процесса ====
 +
 +Базовое завершение:
 +<code bash>
 +kill pid
 +</code>
 +
 +^ Сигнал ^ Описание ^
 +| TERM (15) | Завершение (по умолчанию) |
 +| STOP | Приостановка процесса |
 +| CONT | Продолжение процесса |
 +| INT (2) | Прерывание (аналог Ctrl+C) |
 +| KILL (9) | Принудительное завершение (не игнорируется) |
 +
 +<code bash>
 +kill -STOP pid       # Приостановить
 +kill -CONT pid       # Продолжить
 +kill -9 pid          # Принудительное завершение
 +kill -l              # Список сигналов
 +</code>
 +
 +Используйте KILL только в крайнем случае!
 +
 +==== Управление заданиями ====
 +
 +  * **Ctrl+Z** - отправить сигнал TSTP (приостановка)
 +  * **fg** - вывести на передний план
 +  * **bg** - переместить на задний план
 +  * **jobs** - список приостановленных процессов
 +
 +==== Фоновые процессы ====
 +
 +Запуск процесса в фоне:
 +<code bash>
 +gunzip file.gz &
 +</code>
 +
 +Оболочка вернёт приглашение и выведет PID процесса. Процесс продолжит работу после выхода из системы.
 +
 +Для удалённого сеанса используйте **nohup** для сохранения процесса после отключения.
 +
 +**Проблемы фоновых процессов:**
 +  * Процесс может ожидать ввода → использовать перенаправление (раздел 2.14)
 +  * Вывод может помешать текущей работе → перенаправить в файл
 +
 +Обновление экрана терминала:
 +  * **Ctrl+L** - очистка и обновление (bash)
 +  * **Ctrl+R** - обновление строки (или поиск истории)
 +
 +
 +===== 2.17 Режимы файлов и права доступа =====
 +
 +Каждый файл Unix имеет права доступа, определяемые командой ''ls -l''. Режим файла состоит из четырех частей:
 +
 +  * **Тип файла** - первый символ: ''-'' (обычный файл) или ''d'' (каталог)
 +  * **Права пользователя** - владельца файла
 +  * **Права группы** - для пользователей в группе файла
 +  * **Права остальных** - для всех прочих пользователей
 +
 +Каждый набор прав содержит до 3 символов:
 +^ Символ ^ Значение ^
 +| r | Чтение |
 +| w | Запись |
 +| x | Выполнение |
 +| - | Нет прав |
 +
 +При наличии ''s'' вместо ''x'' в правах пользователя - это **setuid**, программа выполняется от имени владельца файла (часто суперпользователя).
 +
 +==== Изменение прав доступа ====
 +
 +Используйте команду ''chmod'':
 +
 +<code bash>
 +chmod g+r file      # добавить чтение группе
 +chmod o+r file      # добавить чтение остальным
 +chmod go+r file     # одной командой
 +chmod go-r file     # удалить права
 +chmod 644 file      # абсолютный режим (восьмеричная система)
 +</code>
 +
 +**Частые абсолютные режимы:**
 +
 +^ Режим ^ Назначение ^ Применение ^
 +| 644 | u: rw, g: r, o: r | Файлы |
 +| 600 | u: rw, g: -, o: - | Файлы (приватные) |
 +| 755 | u: rwx, g: rx, o: rx | Каталоги, программы |
 +| 700 | u: rwx, g: -, o: - | Каталоги, программы (приватные) |
 +| 711 | u: rwx, g: x, o: x | Каталоги (доступны только владельцу) |
 +
 +**Права каталогов:** требуются оба права - ''r'' (просмотр содержимого) и ''x'' (доступ к файлам).
 +
 +**Маска по умолчанию (umask):**
 +
 +<code bash>
 +umask 022   # все видят созданные файлы
 +umask 077   # только владелец видит созданные файлы
 +</code>
 +
 +Поместите в файл запуска для постоянного применения (см. глава 13).
 +
 +==== Использование символических ссылок ====
 +
 +**Символическая ссылка** (symlink) - это файл-псевдоним, указывающий на другой файл или каталог, скрывая пути каталогов.
 +
 +В ''ls -l'' отображается с типом файла ''l'':
 +<code>
 +lrwxrwxrwx 1 ruser users 11 Feb 27 13:52 somedir -> /home/origdir
 +</code>
 +
 +При доступе к ''somedir'' система перенаправляет на ''/home/origdir''. Целевой объект может даже не существовать, но программы вернут ошибку при попытке доступа.
 +
 +Создание:
 +
 +<code bash>
 +ln -s target linkname
 +</code>
 +
 +  * **target** - путь на файл/каталог
 +  * **linkname** - имя создаваемой ссылки
 +  * **флаг -s** - обязателен для символической ссылки
 +
 +Символические vs жесткие ссылки: Без флага ''**-s**'' команда ''ln'' создает **жесткую ссылку** - второе реальное имя того же файла. Жесткие ссылки еще более запутанные; избегайте их до раздела 4.6.
 +
 +===== 2.18 Архивирование и сжатие файлов =====
 +
 +Две основные утилиты для работы с архивами и сжатием: **gzip** и **tar**.
 +
 +==== Утилита gzip ====
 +
 +**gzip** (GNU Zip) - стандартная программа сжатия файлов. Файлы заканчиваются на ''.gz''.
 +
 +<code bash>
 +gunzip file.gz   # распаковать и удалить .gz
 +gzip file        # сжать файл
 +</code>
 +
 +**gzip не создает архивы** (не упаковывает несколько файлов в один)!
 +
 +==== Утилита tar ====
 +
 +**tar** - создает архивы из нескольких файлов и каталогов.
 +
 +<code bash>
 +tar cvf archive.tar file1 file2 ...   # создание архива
 +tar xvf archive.tar                   # распаковка
 +tar tvf archive.tar                   # просмотр содержимого
 +</code>
 +
 +^ Флаг ^ Значение ^
 +| c | Режим создания архива (create) |
 +| x | Режим извлечения (extract) |
 +| t | Режим содержания (table of contents) |
 +| v | Подробный вывод (verbose); vv - с размерами и правами |
 +| f | Файл-параметр; следующий аргумент - имя архива |
 +| p | Сохранить права доступа при распаковке |
 +
 +**Перед распаковкой всегда проверьте архив флагом ''t''** - убедитесь в рациональной структуре каталогов. Создайте временный каталог, если сомневаетесь.
 +
 +**Примечание:** tar не удаляет исходный архив после распаковки.
 +
 +==== Сжатые архивы (.tar.gz) ====
 +
 +Для работы со сжатым архивом - сначала ''gunzip'', потом ''tar'':
 +
 +<code bash>
 +gunzip file.tar.gz
 +tar xvf file.tar
 +</code>
 +
 +Или в один конвейер:
 +
 +<code bash>
 +zcat file.tar.gz | tar xvf -
 +</code>
 +
 +**Быстрое сокращение** - используйте флаг ''z'' в tar:
 +
 +<code bash>
 +tar ztvf file.tar.gz   # просмотр
 +tar zxvf file.tar.gz   # распаковка
 +tar zcvf file.tar.gz file1 file2   # создание
 +</code>
 +
 +**Примечание:** ''.tgz'' = ''.tar.gz'' (сокращение для FAT-файловых систем).
 +
 +==== Утилита zcat ====
 +
 +**zcat** действует как ''gunzip -dc'' - распаковывает и отправляет результат в стандартный вывод. Используется в конвейерах с tar.
 +
 +==== Другие утилиты сжатия ====
 +
 +^ Утилита ^ Суффикс ^ Распаковка ^ Свойства ^
 +| bzip2 | .bz2 | bunzip2 | Сильнее сжимает текст, медленнее gzip |
 +| xz | .xz | unxz | Сильнее сжимает текст, медленнее gzip |
 +| zip/unzip | .zip | unzip | Совместимы с Windows |
 +| compress | .z | gunzip | Древний стандарт Unix (только распаковка) |
 +
 +===== 2.19 Основная иерархия каталогов Linux =====
 +
 +Структура каталогов определена Стандартом иерархии файловой системы (FHS). Вот основные подкаталоги корневого каталога ''/'' :
 +
 +^ Каталог ^ Описание ^
 +| /bin | Исполняемые файлы основных Unix-команд (''ls'', ''cp'' и т.д.). Большинство на C, некоторые — скрипты оболочки. |
 +| /dev | Файлы устройств (см. глава 3). |
 +| /etc | Центральный каталог конфигурации системы: пароли пользователей, загрузочные файлы, сетевые настройки. |
 +| /home | Домашние (личные) каталоги обычных пользователей. |
 +| /lib | Библиотеки (library). Содержит разделяемые библиотеки, используемые исполняемыми файлами. /usr/lib включает статические и прочие вспомогательные файлы. |
 +| /proc | Системная статистика через интерфейс каталогов/файлов. Информация о процессах и параметры ядра. |
 +| /run | Данные времени выполнения системы: PID-файлы, сокеты, состояние, системный журнал. (В старых системах — /var/run) |
 +| /sys | Интерфейс к устройствам и системе (см. глава 3). |
 +| /sbin | Системные исполняемые файлы для администраторов. Обычные пользователи не имеют доступа. |
 +| /tmp | Временные файлы. Любой пользователь может читать/писать. **⚠️ Не сохраняйте важные файлы** — очищается при загрузке. |
 +| /usr | Основная иерархия системы Linux (см. раздел ниже). Содержит программы и данные пользователей. |
 +| /var | Переменные данные: системные журналы, отслеживание активности, кэши, управляемые системными программами. |
 +| /boot | Файлы загрузчика и ядра. Первый этап запуска Linux (см. глава 5). |
 +| /media | Базовый каталог для съемных носителей (флеш-накопители). |
 +| /opt | Дополнительное ПО третьих производителей. Используется не всеми системами. |
 +
 +==== Каталог /usr ====
 +
 +Содержит большую часть пользовательских программ и данных системы. Структура повторяет корневой каталог (например, ''/usr/bin'' и ''/usr/lib''):
 +
 +^ Каталог ^ Описание ^
 +| /usr/bin | Пользовательские исполняемые файлы. |
 +| /usr/sbin | Системные исполняемые файлы. |
 +| /usr/lib | Библиотеки (статические, разделяемые и вспомогательные файлы). |
 +| /usr/include | Файлы заголовков для компилятора C. |
 +| /usr/local | Место для установки собственного ПО администраторами. Структура как в / и /usr. |
 +| /usr/man | Страницы руководства. |
 +| /usr/share | Файлы, совместимые со всеми Unix-системами. Вспомогательные данные, читаемые программами. (Исторически — для сетевого общего доступа) |
 +
 +**Историческая причина:** Разделение системы между ''/'' и ''/usr'' было сделано для снижения требований к пространству корневого каталога.
 +
 +==== Местонахождение ядра ====
 +
 +**Ядро Linux** обычно расположено как двоичный файл:
 +
 +<code>
 +/vmlinuz    или    /boot/vmlinuz
 +</code>
 +
 +Загрузчик (boot loader) загружает этот файл в память при запуске системы (см. глава 5). После запуска основной файл ядра не используется.
 +
 +**Загружаемые модули ядра** расположены в папке:
 +
 +<code>
 +/lib/modules
 +</code>
 +
 +Ядро загружает и выгружает эти модули по требованию во время работы системы.
 +
 +