# Shell, файлы и рабочее окружение

Первое занятие связывает устройство системы с тем, что мы делаем в терминале: **ОС управляет ресурсами → пользователь общается с ней через программы → shell запускает команды → команды работают с файлами и каталогами**. Сначала построим эту картину, затем пройдём один небольшой опыт с заметкой.

> **Результат:** различать ядро, дистрибутив, терминал и shell; понимать контекст команды; создать, прочитать и скопировать файл, объяснить путь и отличие копии от ссылки. Практика служит самооценке, экзаменов и оценок нет.

> **Как читать:** разделы идут в порядке объяснения. Раскрываемые блоки «Дополнительно» позволяют углубить текущую тему, не меняя основной последовательности.

## 1. Зачем нужна операционная система

У программ общие ресурсы: процессор, память, диски и устройства. Если каждая программа напрямую распоряжается всем оборудованием, трудно запускать их вместе и защищать данные друг от друга. ОС даёт программам общие способы работы с ресурсами и контролирует доступ к ним.

**Ядро** — центральная часть этой работы. Оно управляет процессами, памятью, устройствами и предоставляет системные интерфейсы. Программа просит открыть файл или выделить память; ядро выполняет разрешённую операцию. Редактор, командная оболочка и веб-сервер — программы, использующие эти интерфейсы.

![Приложения используют системные вызовы; ядро управляет ресурсами и доступом.](assets/kernel-boundary.svg)

*Следите за направлением обращения: программа → интерфейс ОС → ядро → ресурс. Shell находится среди программ, а не заменяет ядро.*

[Открыть иллюстрацию крупнее](assets/kernel-boundary.svg)

Одного ядра недостаточно для удобной установленной системы. Нужны средства входа, оболочка, утилиты, библиотеки, настройки и способ обновления программ. Поэтому **ядро Linux и система на его основе — не одно и то же**.

**Переход:** устройство системы складывалось десятилетиями. История помогает понять, почему в ней важны пользователи, терминалы и небольшие взаимодействующие программы.

## 2. От Unix к GNU и Linux

Unix развивается с 1969 года. Дорогим общим компьютером пользовались несколько людей через отдельные терминалы. Отсюда естественны учётные записи, одновременная работа программ и разделение доступа. Инструменты выполняют отдельные задачи; оболочка позволяет их запускать и сочетать. Позднее в курсе мы соединим инструменты потоками данных.

Проект GNU объявлен в 1983 году, разработка началась в 1984-м: он создавал свободную Unix-подобную систему и её инструменты. В 1991 году появилось независимо разработанное ядро Linux. В сочетании с GNU и другими проектами оно стало основой полноценных систем. Linux следует многим идеям Unix, но не является очередным выпуском его исходного кода.

Для исторического масштаба Windows NT 3.1 вышла в 1993 году, когда у Unix-систем уже был длительный опыт многопользовательской и многозадачной работы. Мы изучаем зрелые архитектурные принципы, а не недавнюю моду.

**POSIX** — семейство стандартов интерфейсов и поведения программ. Общие принципы помогают переносить навыки, но не обещают одинаковые параметры всех команд или запуск любого Linux-бинарника на любой Unix-подобной ОС.

<details><summary>Дополнительно · Исторические связи и стандарты</summary>

- **1969: Unix в Bell Labs.** Работа многих пользователей с общим компьютером помогает понять, почему учётные записи, процессы и терминалы стали важными частями системы. Unix развивался в разные ветви; BSD — одна из исторических линий этого развития.
- **1983–1984: GNU.** Ричард Столлман объявил проект в 1983 году; разработка началась в 1984-м. Цель — свободная Unix-подобная система. GNU создавал инструменты и компоненты системы ещё до появления Linux.
- **1991: Linux.** Линус Торвальдс начал разработку Unix-подобного ядра. В сочетании с GNU и другими проектами оно стало основой полноценных систем. Ядро и весь набор программ разрабатываются разными сообществами.
- **Дистрибутивы.** Собрать компоненты недостаточно: нужны совместимые версии, установка, обновления и сопровождение. Эту работу организует дистрибутив. Различия между дистрибутивами не сводятся к внешнему виду рабочего стола.

Упрощённая схема связей — не полная родословная исходного кода:

```text
Unix ── историческое развитие ──→ BSD и другие ветви
  │
  └── идеи и интерфейсы ──→ GNU и Linux (отдельные проекты)
                              │
                    GNU + Linux + другие компоненты
                              │
                         Debian GNU/Linux
```

Название UNIX также связано с сертификацией конкретных продуктов. Историческое происхождение, Unix-подобное устройство и наличие сертификата — три разных вопроса. Для работы в этом курсе важнее понять общие принципы, чем заучивать перечень сертифицированных систем.

Одинаковое ядро не означает одинаковое окружение: например, использование Linux в Android не превращает Android в Debian. И наличие графического рабочего стола не определяет, является ли система Unix-подобной. При сравнении с Windows полезнее обсуждать конкретные способы установки программ, организации файлов и администрирования, чем делить системы на «только командные» и «только графические».



</details>

**Переход:** ядро и утилиты создают разные проекты. Чтобы получить систему, которую можно установить и сопровождать, их нужно собрать вместе.

## 3. Что добавляет дистрибутив

Дистрибутив подбирает совместимые компоненты, устанавливает настройки и организует выпуск пакетов, обновлений и документации. Debian GNU/Linux объединяет Linux, инструменты GNU и множество других программ. Bash — одна из этих программ. У ядра, Bash и Debian могут быть разные номера версий: это разные компоненты.

Разнообразие дистрибутивов отвечает разным задачам. Серверу важны предсказуемые обновления и сопровождение, ноутбуку — поддержка оборудования, маршрутизатору — подходящий состав и размер системы. Свободное ПО позволяет командам собирать собственные варианты; различия не сводятся к оформлению рабочего стола.

Linux используется на серверах приложений и БД, облачных VM, рабочих станциях, сетевых и встраиваемых устройствах, суперкомпьютерах. Ядро также лежит в основе Android. Поэтому его распространённость значительно шире настольных Linux-систем. Одинаковое ядро не означает одинаковые инструменты управления: Android не администрируется как Debian.

В курсе общее окружение — **Debian 13**. Принципы файлов, процессов и прав переносимы; команды управления пакетами и настройки конкретной системы нужно проверять по её справке.

<details><summary>Дополнительно · Примеры и принципы выбора</summary>

| Пример | Что показывает |
| --- | --- |
| Debian, Ubuntu | Универсальные системы для серверов и рабочих компьютеров; Ubuntu развивается на основе Debian, но имеет собственные выпуски и правила сопровождения |
| Fedora | Разные редакции для рабочих станций, серверов, облаков и устройств; один проект охватывает несколько задач |
| Arch Linux | Rolling release: система обновляется непрерывно, без обычного перехода между крупными выпусками; пользователь сам выбирает состав окружения |
| Alpine Linux | Компактная система с musl и BusyBox, применяемая в том числе в контейнерных окружениях; малый размер не гарантирует совместимость с программами для другого окружения |
| OpenWrt | Специализация на сетевых и встраиваемых устройствах, включая маршрутизаторы |

Это примеры различий, а не рейтинг и не исчерпывающий список. Графическую оболочку
часто можно заменить, не меняя дистрибутив. Android также использует ядро Linux,
но его прикладное окружение и управление существенно отличаются от Debian.

При выборе сначала выясняют требования приложения и оборудования, затем срок
поддержки, способ обновления и восстановления, качество документации и опыт команды.
Для организации может быть важна поддержка поставщика и сертификация нужного ПО.
Самая новая версия каждой программы не всегда важнее предсказуемости изменений;
редкие обновления компонентов не означают отказ от исправлений безопасности.

**Обсуждение:** чем будут отличаться требования к системе на ноутбуке разработчика,
сервере БД и домашнем маршрутизаторе? Назовите свойства, которые нужно проверить,
прежде чем выбирать название дистрибутива. Устанавливать все варианты для ответа
не требуется.

</details>

<details><summary>Дополнительно · Масштаб использования: данные и источники</summary>

Для масштаба, по данным, проверенным в сентябре 2026 года:

- Android, использующий ядро Linux, занимает **67,61% мобильного веб-трафика** в измерениях Statcounter за август 2026 года. Это доля наблюдаемого трафика, а не перепись всех телефонов.
- W3Techs сообщает **62,5% сайтов с известной исследователю ОС** на Linux (13 сентября 2026 года). Это большинство в данной выборке веб-сайтов, а не точное число всех физических серверов мира.
- В рейтинге TOP500 за июнь 2026 года Linux-системы представлены в том числе среди ведущих суперкомпьютеров.

Поэтому навыки Linux нужны для работы с уже существующей инфраструктурой огромного масштаба. Долю настольных установок нельзя использовать как меру общей распространённости ядра. При этом одинаковое ядро не означает, что Android администрируется командами и пакетами Debian.

Источники чисел и архитектуры: [Statcounter](https://gs.statcounter.com/os-market-share/mobile/worldwide), [W3Techs](https://w3techs.com/technologies/details/os-linux), [архитектура Android](https://developer.android.com/guide/platform?hl=ru), [TOP500, июнь 2026](https://www.top500.org/lists/top500/2026/06/). Ссылки динамические; период измерений указан рядом с цифрами.

</details>

**Переход:** система уже установлена. Нам нужен способ передать ей команду и увидеть результат.

## 4. Терминал, shell и подключение

Терминал обеспечивает текстовый ввод и вывод. Shell — программа, которая принимает командную строку, разбирает её и выполняет встроенное действие или запускает другую программу. В нашем окружении это Bash. Терминал, shell и ядро — три разных участника взаимодействия.

![Исторический терминал IBM: экран и клавиатура для работы с общей вычислительной системой.](assets/illustrations/IBM_2260_video_display_terminal.jpg)

*Раньше отдельные терминалы подключались к общей машине. Современное окно терминала сохраняет идею ввода и вывода, а SSH позволяет работать с shell удалённой машины.*

[Открыть иллюстрацию крупнее](assets/illustrations/IBM_2260_video_display_terminal.jpg)

Для практики используем выделенную учебную VM и обычную учётную запись. На Windows можно использовать OpenSSH или PuTTY, на Linux и macOS — ssh в терминале. Преподаватель сообщает фактические имя пользователя, адрес и отпечаток ключа сервера.

```sh
ssh student@192.168.56.10
```

Здесь имя и адрес — пример, замените их выданными. При первом подключении сравните отпечаток **ключа сервера** с полученным от преподавателя. Ключ подтверждает, к какой машине вы подключились; пароль подтверждает вашу личность серверу. Неожиданное изменение отпечатка нужно выяснить.

После входа выполните команды по одной:

```sh
hostname
whoami
pwd
```

Они отвечают на три разных вопроса: **какая машина, какой пользователь, какой текущий каталог**. В двух окнах могут быть разные машины или разные сессии одной машины. Текст приглашения помогает ориентироваться, но не является частью вводимой команды.

**Переход:** машина и пользователь понятны. Теперь разберём место, относительно которого команды находят файлы.

## 5. Одно дерево каталогов и пути

Файлы организованы в общее дерево от корня `/`. Домашний каталог — одна из его ветвей, например `/home/student`. Диски и другие файловые системы подключаются в точки этого дерева; подробное монтирование рассмотрим на занятии о хранении.

Путь указывает, как найти объект. **Абсолютный** начинается с `/`, **относительный** отсчитывается от текущего каталога. `.` обозначает текущий каталог, `..` — родительский. Bash раскрывает `~` в начале слова в домашний каталог.

```sh
pwd
ls
cd /etc
pwd
cd ..
pwd
cd ~
pwd
```

`ls` показывает имена, `cd` меняет текущий каталог shell. После перехода из `/etc` в `..` окажемся в `/`; после `cd ~` — дома. Содержимое каталогов при переходах не меняется. Один относительный путь из разных мест может вести к разным объектам.

Назначение стандартных каталогов описывает **FHS**. Для начала достаточно ориентиров:

| Путь | Назначение |
| --- | --- |
| `/home` | Домашние каталоги обычных пользователей |
| `/etc` | Конфигурация системы и сервисов |
| `/usr` | Установленные программы и общие ресурсы |
| `/var` | Изменяемые данные, журналы, очереди |
| `/run` | Данные текущего запуска |
| `/dev`, `/proc`, `/sys` | Интерфейсы к устройствам, процессам и ядру |

В современной Debian `/bin`, `/sbin`, `/lib` связаны с соответствующими каталогами в `/usr`. На Debian 13 `/tmp` по умолчанию использует tmpfs; не используйте его для постоянной учебной заметки. Ссылка на FHS есть в конце — весь стандарт запоминать не нужно.

**Переход:** мы уже передавали cd путь. Теперь посмотрим, как shell отделяет команду от её аргументов — это важно до работы с именами, содержащими пробел.

## 6. Команда, аргументы, кавычки и справка

В строке `ls -l /etc` команда — `ls`, `-l` задаёт подробный вывод, `/etc` указывает каталог. У программ бывают короткие и длинные параметры; их смысл определяется самой программой. Пробелы разделяют слова командной строки.

Создадим рабочее место для дальнейших опытов:

```sh
mkdir -p ~/course/day01
cd ~/course/day01
```

`mkdir` создаёт каталог, `-p` позволяет создать недостающие родительские каталоги. Все последующие изменения делаем здесь, на своих учебных файлах.

Сравните две команды:

```sh
mkdir one two
mkdir 'one two'
ls
```

Первая создала **два каталога**, вторая — **один каталог с пробелом в имени**. Кавычки направляют разбор shell; в само имя они не входят. Для буквального имени с пробелом подходят и одинарные, и двойные кавычки.

Различие между ними видно на переменной HOME. Переменная хранит значение, `$HOME` просит shell подставить его:

```sh
echo '$HOME'
echo "$HOME"
```

`echo` печатает переданный текст. Первый вызов покажет буквально `$HOME`, второй — путь домашнего каталога. Одинарные кавычки сохраняют текст буквально; двойные допускают такую подстановку и сохраняют результат одним аргументом. Для сегодняшних файлов достаточно этих правил.

Имена чувствительны к регистру: `Report` и `report` различны. Точка в начале имени скрывает его из обычного ls; `ls -a` показывает и такие имена. Это соглашение отображения, не защита доступа.

### Откуда shell берёт команду

```sh
type cd
type ls
```

Cd должен менять каталог самой оболочки, поэтому встроен в неё. Ls обычно запускается как внешняя программа; type может также показать alias. Внешние программы shell ищет в каталогах переменной PATH. Для справки по встроенной команде — `help cd`, по ls — `man ls` или `ls --help`. Из man выходят клавишей `q`. Ключ `-h` не универсален: сначала посмотрите справку.

### Как удобно вводить и исправлять

Tab дополняет имя или путь; стрелка вверх возвращает предыдущую команду. Ctrl+A — к началу строки, Ctrl+W — убрать предыдущее слово, Ctrl+L — очистить экран. Ctrl+C обычно прерывает текущую команду или отменяет незавершённый ввод. Ctrl+D на пустой строке shell означает конец ввода и может завершить сессию: это не вариант очистки экрана. Используйте сочетания по мере необходимости, не как отдельный набор для заучивания.

<details><summary>Дополнительно · История, сокращения и поиск команд</summary>

Ctrl+R ищет по истории. `history` хранит команды, а не весь вывод терминала. Не вводите пароли в командной строке. Ctrl+Z приостанавливает задание; к нему, jobs, fg и bg вернёмся вместе с процессами на занятии 3.

`alias ll='ls -lah'` создаёт сокращение в текущем shell; проверьте `type ll`, затем уберите `unalias ll`. `pushd /etc`, `dirs`, `popd` позволяют временно перейти и вернуться. `type` учитывает встроенные команды и alias, а `which` не всегда отражает всё, что выполнит shell. `whereis` ищет связанные файлы. `locate` использует подготовленную базу, `find` обходит дерево сейчас.

Man разделён по видам документации: `man 1 printf` — команда, `man 3 printf` — библиотечная функция, если установлена эта страница. `info` — другой способ чтения документации GNU. Просмотр справки не требует запускать каждую найденную команду.

</details>

**Переход:** мы умеем назвать нужный путь одним аргументом и найти справку. Теперь создадим настоящий документ и проследим его изменения.

## 7. Один документ: создание, чтение, копирование

Вернитесь в рабочий каталог и откройте редактор:

```sh
cd ~/course/day01
nano note.txt
```

Введите `Первая запись`. Сохраните через Ctrl+O, подтвердите имя Enter и выйдите Ctrl+X. Затем прочитайте сохранённый файл:

```sh
cat note.txt
```

Ожидается введённая строка. Редактор изменил содержимое файла, cat прочитал его. Оба обращаются к одному объекту по имени.

Теперь создадим самостоятельную копию:

```sh
cp note.txt copy.txt
mv copy.txt saved.txt
ls
```

Cp создал второй файл; mv переименовал копию. Имена note.txt и saved.txt существуют, copy.txt больше нет. Откройте saved.txt в редакторе и замените текст на `Изменённая копия`, затем прочитайте оба:

```sh
cat note.txt
cat saved.txt
```

Исходная заметка не изменилась. `rm saved.txt` удаляет это учебное имя; обычный rm не отправляет его в корзину. Удаляйте здесь только созданные для опыта файлы. `touch empty.txt` создаёт пустой файл, если его нет; у существующего меняет времена, не стирая содержимое. `rmdir empty-dir` удаляет пустой каталог, если вы предварительно создали его через mkdir.

Минимум для vi/Vim: `i` — ввод, Esc — обычный режим, `:wq` — сохранить и выйти, `:q!` — выйти без сохранения. Для основной заметки достаточно одного выбранного редактора.

Для самостоятельной практики: [OpenVim — интерактивный учебник Vim в браузере](https://openvim.com/).

<details><summary>Дополнительно · Грамматика редактирования Vim</summary>

Nano, joe, mcedit, Emacs и Vim — разные варианты редактора; выбор привычного инструмента не отменяет полезности минимального vi на незнакомой системе. В Vim сочетайте **число + действие + перемещение**, например `d2w` удаляет два слова от курсора. Работайте на копии заметки.

| Задача | Клавиши в normal mode |
| --- | --- |
| Движение | `h j k l`; `5j` — пять строк вниз; `w`/`b` — по словам |
| Границы | `^` — первый непробельный символ, `$` — конец строки; `gg`/`G` — начало/конец файла; `:10` — строка 10 |
| Крупные фрагменты | `(`/`)` — предложения, `{`/`}` — абзацы |
| Ввод/замена | `i` — перед курсором, `a` — после, `r` — один символ, `cw` — изменить слово |
| Удаление/копия | `x`, `dd`, `d$`; `yy`, `yw`, затем `p`; `u` отменяет изменение |
| Поиск | `/текст`, Enter, затем `n`; Esc возвращает из режима ввода |
| Сохранение | `:w`, `:w другое_имя`, `:q`; `:q!` отбрасывает несохранённые изменения |

После знакомства с регулярными выражениями на занятии 4 вернитесь к подстановкам: `:s/старое/новое/` меняет первое совпадение строки, `:1,10s/старое/новое/gc` — совпадения в строках 1–10 с подтверждением, `:%s/старое/новое/gc` — во всём файле. Здесь `g` означает все совпадения в строке, `c` — запрос подтверждения. Для тренировки доступен `vimtutor ru`, если установлены файлы учебника.

</details>

**Переход:** копия сохранила текст, но стала отдельным файлом. Что именно отличает объект файла от имени, которым мы к нему обращаемся?

## 8. Содержимое, свойства, имена и ссылки

У файла есть содержимое и метаданные: тип, владелец, права, размер, времена. `cat note.txt` показывает текст, `stat note.txt` — свойства, `ls -l note.txt` — часть свойств в коротком виде. Владелец и права понадобятся на следующем занятии; сейчас достаточно увидеть, что они относятся к файлу.

Каталог содержит имена и связи с объектами файловой системы. **Inode** описывает объект и хранит сведения о нём, включая информацию для доступа к данным; имя находится в каталоге. **Жёсткая ссылка** — ещё одно имя того же объекта. Это позволяет нескольким именам вести к общему содержимому.

### Второе имя и самостоятельная копия

Работаем в `~/course/day01`, где уже есть note.txt:

```sh
cp note.txt separate.txt
ln note.txt copy-name
ls -li note.txt separate.txt copy-name
```

У note.txt и copy-name одинаковый номер inode и число жёстких ссылок 2. У separate.txt другой inode. Номера могут быть любыми; сравниваем равенство, не конкретные значения.

Откройте copy-name в nano и измените текст. Затем сравните `cat note.txt` и `cat separate.txt`: новое содержимое видно через исходное имя, а самостоятельная копия хранит прежний текст. Для этого опыта nano обычно пишет существующий файл на месте. Некоторые редакторы сохраняют через замену файла; если поведение отличается, проверьте inode после сохранения.

### Ссылка, которая хранит путь

```sh
ln -s note.txt shortcut
ls -l shortcut
readlink shortcut
cat shortcut
```

Symlink — отдельный объект, содержащий путь `note.txt`. Readlink показывает именно этот путь; cat проходит по нему к цели.

![Два имени ведут к одному inode, символическая ссылка хранит отдельный путь.](assets/inode-links.svg)

*На схеме те же имена, что в опыте. Числа inode условные.*

[Открыть иллюстрацию крупнее](assets/inode-links.svg)

Удалим только одно учебное имя:

```sh
rm note.txt
cat copy-name
cat shortcut
```

Copy-name продолжает работать: второе имя того же объекта осталось. Shortcut не находит цель, потому что сохранённого имени note.txt больше нет. Это не поведение копии: текст в symlink не хранится.

<details><summary>Дополнительно · Границы ссылок и виды файлов</summary>

Жёсткие ссылки обычного пользователя создаются для файлов в пределах одной файловой системы. Символическая ссылка может вести в другую FS или на каталог; цель может вообще не существовать. Относительная цель отсчитывается от каталога самой ссылки. Создайте отдельную ссылку `ln -s copy-name relative-link`, затем переместите её в созданный подкаталог: прежний относительный путь будет разрешаться из другого места. Можно также показать ссылку на каталог и ошибку при цикле ссылок.

После удаления последнего имени данные открытого файла могут оставаться доступными уже работающему процессу до закрытия. Подробности дескрипторов — на занятии 3. `truncate` изменяет размер файла, в отличие от touch; экспериментировать нужно на отдельной копии.

Начальный символ ls -l показывает тип: обычный файл `-`, каталог `d`, symlink `l`, блочное устройство `b`, символьное `c`, FIFO `p`, сокет `s`. `file copy-name` исследует содержимое — это другой вопрос. Посмотрите `ls -l /dev/null`: перед нами интерфейс устройства, не текстовая заметка. `/dev/urandom` предоставляет случайные байты; выводить неограниченный поток в терминал не нужно.

Фраза «всё — файл» напоминает об общих интерфейсах, а не утверждает, что все объекты лежат обычными файлами на диске. Разные типы поддерживают разные операции: чтение, запись, позиционирование, изменение размера. FIFO и сокеты разберём после потоков.

</details>

## 9. Собираем картину и проверяем себя

Терминал передаёт ввод оболочке. Оболочка разбирает команду и аргументы. Программа обращается к ОС, чтобы найти файл по пути и выполнить операцию. Каталоги связывают имена с объектами; объект имеет содержимое и свойства. Эта цепочка объясняет каждое действие нашего опыта.

Для самостоятельной практики создайте **новый** учебный каталог и повторите маленькую задачу: заметка с пробелом в имени, отдельная копия, жёсткая и символическая ссылки. Перед удалением одного имени предскажите, что останется доступным. Перейдите в другой каталог и откройте заметку по абсолютному пути. Найдите в справке способ увидеть скрытые имена.

<details><summary>Сверить рассуждение</summary>

Кавычки сохраняют имя с пробелом одним аргументом. Текущий каталог влияет на относительный путь; абсолютный начинается от корня. Копия самостоятельна, hard link ведёт к тому же inode, symlink хранит путь. Удаление одного имени не уничтожает другое имя того же объекта.

</details>

В свойствах файла мы видели владельца и права. На следующем занятии разберём, **кто может выполнить каждое из знакомых действий** и как система принимает это решение.

## Материалы для самостоятельного изучения

- [Дистрибутив Linux — Википедия](https://ru.wikipedia.org/wiki/Дистрибутив_Linux) — состав, разнообразие и примеры дистрибутивов.

- [FHS — Википедия](https://ru.wikipedia.org/wiki/Filesystem_Hierarchy_Standard) — стандарт размещения файлов и назначения каталогов.

- [Unix — Википедия](https://ru.wikipedia.org/wiki/Unix) — происхождение и семейство систем.
- [GNU — Википедия](https://ru.wikipedia.org/wiki/GNU) — проект и его роль в системе.
- [Linux — Википедия](https://ru.wikipedia.org/wiki/Linux) — история и состав систем на основе ядра Linux.
- [POSIX — Википедия](https://ru.wikipedia.org/wiki/POSIX) — назначение стандартов совместимости.

- [Bash — Википедия](https://ru.wikipedia.org/wiki/Bash)
- [Файловая система — Википедия](https://ru.wikipedia.org/wiki/Файловая_система)
- [Символическая ссылка — Википедия](https://ru.wikipedia.org/wiki/Символическая_ссылка)
