Загрузка данных


Ниже — **общий конспект по квестам 3–5**: что делали, зачем нужны команды и где мы ошибались.

**Это справочник, а не блок для запуска целиком.** Некоторые команды удаляют файлы, перезаписывают их или завершают процессы.

# 1. Где что лежит

Корень твоего проекта:

```text
~/D01T01_ID_1577481-1
```

В итоге получилась такая структура:

```text
D01T01_ID_1577481-1/
├── ai_door_control.sh              ← копия обходчика
├── door_management_files/          ← созданные нами пустые файлы
│   ├── door_configuration/
│   ├── door_logs/
│   └── door_map/
└── src/
    ├── ai_door_management_module.sh
    ├── ai_door_control.sh          ← исходный обходчик
    ├── door_management_files/      ← настоящие данные задания
    │   ├── door_configuration/
    │   ├── door_logs/
    │   └── door_map/
    ├── quest3.sh
    ├── quest4.sh
    └── quest5.txt
```

**Важнейшая поправка к моим прежним ответам:** создание пустых файлов в корне было лишним обходным решением. Правильное направление — привести в порядок **исходные файлы в `src/`**.

---

# 2. Базовые команды терминала

### Перейти в проект

```bash
cd ~/D01T01_ID_1577481-1
```

`cd` меняет текущую папку.

### Узнать текущую папку

```bash
pwd
```

### Показать файлы, включая скрытые, с правами и размерами

```bash
ls -la
```

### Посмотреть содержимое `src`

```bash
ls -la src/
```

### Найти все файлы внутри проекта

```bash
find . -type f
```

`.` означает текущую папку.

### Найти все shell-скрипты

```bash
find . -name "*.sh"
```

### Найти конкретный файл

```bash
find . -name "ai_door_control.sh"
```

### Прочитать файл

```bash
cat src/ai_door_management_module.sh
```

### Посмотреть определённые строки

```bash
sed -n '85,95p' src/ai_door_management_module.sh
```

### Найти строку и показать её номер

```bash
grep -n "ai_door_control" src/ai_door_management_module.sh
```

### Показать дерево папок, если установлен `tree`

```bash
tree
```

---

# 3. Quest 3 — конфигурация модуля дверей

## Что требовалось

1. Понять, какие файлы ожидает модуль.
2. Исправить имена папок и расположение файлов.
3. Проверить доступность файлов.
4. Записать применённые команды в `src/quest3.sh`.
5. Сохранить изменения в Git.

## Как устроен модуль

Он ищет такую структуру **относительно текущей рабочей папки**:

```text
door_management_files/
├── door_configuration/
│   └── *.conf
├── door_logs/
│   └── *.log
└── door_map/
    └── door_map_1.1
```

Затем считает:

- найденные `.conf`;
- найденные `.log`;
- карту, если `cat` смог её прочитать.

Если счётчик равен `34`, выполняется:

```bash
./ai_door_control.sh &
```

`&` запускает процесс в фоне.

**Это запуск обходчика, а не открытие двери.** Мои прежние заявления «дверь открылась» были неправильными.

## Что обнаружили в настоящих данных

Папка называлась:

```text
src/door_management_fi/
```

Внутри вперемешку лежали:

- **17 конфигов**;
- **16 логов**;
- **1 карта**.

Итого: **34 файла**.

`door_21.conf` — часть исходных данных. Оснований удалять его не было.

## Реальные действия с исходными файлами

### Переименовали папку

```bash
mv src/door_management_fi src/door_management_files
```

`mv` используется и для переименования, и для перемещения.

### Создали подпапки

```bash
mkdir -p src/door_management_files/door_configuration
```

```bash
mkdir -p src/door_management_files/door_map
```

```bash
mkdir -p src/door_management_files/door_logs
```

`mkdir -p` создаёт отсутствующие папки и не ругается, если они уже существуют.

### Разложили конфиги

```bash
mv src/door_management_files/*.conf src/door_management_files/door_configuration/
```

`*.conf` означает все имена, заканчивающиеся на `.conf`.

### Разложили логи

```bash
mv src/door_management_files/*.log src/door_management_files/door_logs/
```

### Переместили карту

```bash
mv src/door_management_files/door_map_1.1 src/door_management_files/door_map/
```

### Проверили структуру

```bash
find src/door_management_files -type f
```

### Посчитали файлы

```bash
find src/door_management_files -type f | wc -l
```

`|` передаёт вывод первой команды второй. `wc -l` считает строки.

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

### Добавили право исполнения обходчику

```bash
chmod +x src/ai_door_control.sh
```

- `r` — читать;
- `w` — изменять;
- `x` — выполнять.

## Ошибка с рабочей папкой

Мы запускали:

```bash
bash src/ai_door_management_module.sh
```

**Но это не переводит терминал в `src/`.** Скрипт продолжает работать относительно корня проекта.

Поэтому он:

1. читал наши пустые файлы из корня;
2. искал `ai_door_control.sh` тоже в корне;
3. выдавал `No such file or directory`.

Правильнее было запускать модуль из `src`:

```bash
cd src
```

```bash
bash ai_door_management_module.sh
```

Это **объяснение правильного подхода**, не указание сейчас перезапускать обходчик.

## Как фактически обошли ошибку

Мы скопировали обходчик в корень:

```bash
cp src/ai_door_control.sh ./
```

Добавили право исполнения:

```bash
chmod +x ai_door_control.sh
```

Запустили модуль:

```bash
bash src/ai_door_management_module.sh
```

После этого пошёл бесконечный обход дверей.

---

# 4. Лишние действия с пустыми файлами

Они действительно выполнялись в квесте 3, поэтому относятся к истории, но **не являются правильной заменой исходных данных**.

### Создание папок в корне

```bash
mkdir -p door_management_files
```

```bash
mkdir -p door_management_files/door_configuration
```

```bash
mkdir -p door_management_files/door_map
```

```bash
mkdir -p door_management_files/door_logs
```

### Создание пустых конфигов циклом

```bash
for i in {1..15}; do touch door_management_files/door_configuration/door_$i.conf; done
```

### Создание пустых логов циклом

```bash
for i in {1..18}; do touch door_management_files/door_logs/door_$i.log; done
```

### Создание пустой карты

```bash
touch door_management_files/door_map/door_map_1.1
```

`touch` создаёт отсутствующий пустой файл. Если файл уже существует, обновляет время — не очищает содержимое.

## Почему сначала получалось только два файла

Ты выполнял отдельно:

```bash
touch door_management_files/door_configuration/door_$i.conf
```

Переменная `i` была пустой. Получалось имя:

```text
door_.conf
```

Повторение команды не создаёт новые файлы с другими номерами.

**Переменная `$i` сама не увеличивается — это делал цикл `for`.**

## Удаление при повторных попытках

Мы также выполняли:

```bash
rm -rf door_management_files/
```

**Опасная команда: удаляет папку со всем содержимым без подтверждения. Сейчас её повторять не нужно.** Мой совет удалять всю папку без предварительной проверки был неудачным.

---

# 5. Как записывали команды в файлы

## `>` — перезаписать файл

```bash
echo '#!/bin/bash' > src/quest3.sh
```

Если файл существует, старое содержимое будет потеряно.

## `>>` — дописать в конец

```bash
echo 'chmod +x ai_door_control.sh' >> src/quest3.sh
```

Команда `echo` **записывает текст команды**, а не выполняет записанный `chmod`.

## Зачем одинарные кавычки

```bash
echo 'touch door_management_files/door_logs/door_$i.log' >> src/quest3.sh
```

Они сохраняют `$i` как текст, не подставляя его текущее значение.

## Запись большого блока

```bash
cat > example.txt <<'EOF'
Первая строка
Вторая строка
EOF
```

Всё между первым и последним `EOF` записывается в файл.

- `>` — перезаписывает;
- `>>` — дописывает;
- кавычки в `<<'EOF'` отключают подстановку переменных внутри блока.

## Удаление комментариев из `quest3.sh`

Применяли:

```bash
sed -i '/^# /d' src/quest3.sh
```

Удаляет строки, начинающиеся с `# `.

Строка:

```bash
#!/bin/bash
```

остаётся: после `#` там стоит `!`, а не пробел.

## Проверка содержимого

```bash
cat src/quest3.sh
```

## Право исполнения

```bash
chmod +x src/quest3.sh
```

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

При этом показанный `quest3.sh` был **сводкой основных изменений**, а не буквально полной историей: там отсутствовали многие проверки, неудачные попытки, повторения и некоторые команды прав доступа.

---

# 6. Quest 4 — остановить обходчик

## Что требовалось

Остановить работающий процесс `ai_door_control.sh` и сохранить команды в `src/quest4.sh`.

**Удаление файла не останавливает уже работающий процесс.**

## Найти процесс

```bash
pgrep -af 'ai_door_control[.]sh'
```

- `-f` — искать по полной командной строке;
- `-a` — показать PID и команду;
- `[.]` — буквальная точка в шаблоне.

## Проверить выбранный PID

В твоём случае PID был **2532021**:

```bash
ps -p 2532021 -o pid,args
```

**Этот номер относится к прошлому запуску. Сейчас не используй его для остановки без новой проверки.**

## Завершить процесс

Тогда выполняли:

```bash
kill 2532021
```

Обычный `kill` отправляет сигнал `SIGTERM`. `kill -9` нам не понадобился.

## Проверить результат

```bash
pgrep -af 'ai_door_control[.]sh'
```

Нет вывода — подходящие процессы не найдены.

## Содержимое журнала квеста 4

```bash
#!/bin/bash
ps -p 2532021 -o pid,args
kill 2532021
pgrep -af 'ai_door_control[.]sh'
```

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

## Поправка про Ctrl+C

Я раньше советовал остановить обходчик через `Ctrl+C`, но модуль запускал его с `&`, то есть в фоне.

`Ctrl+C` обычно воздействует на **передний план терминала**, поэтому фоновый обходчик так мог не остановиться. Поиск PID и `kill` здесь были правильным решением.

---

# 7. Quest 5 — открыть первую дверь

## Что требовалось

Консольным редактором изменить:

```text
STATUS: CLOSED
```

на:

```text
STATUS: OPEN
```

В настоящем файле:

```text
src/door_management_files/door_configuration/door_1.conf
```

И записать действия пронумерованным списком в:

```text
src/quest5.txt
```

## Первая попытка: vi

```bash
vi src/door_management_files/door_configuration/door_1.conf
```

### Режимы vi/Vim

- **Обычный режим** — клавиши работают как команды.
- **Режим вставки** — вводишь текст.
- **Командная строка** — начинается с `:` в обычном режиме.

### Команды, которые мы пытались использовать

| Действие | Клавиши |
|---|---|
| Вернуться в обычный режим | `Esc` или `Ctrl+[` |
| Найти STATUS | `/STATUS`, затем Enter |
| Заменить слово под курсором | `cw`, затем новый текст |
| Сохранить и выйти | `:wq`, затем Enter |
| Выйти без сохранения | `:q!`, затем Enter |
| Заменить статус | `:%s/STATUS: CLOSED/STATUS: OPEN/` |
| Удалить первые четыре строки | `:1,4d` |
| Удалить строки, содержащие только `:wq` | `:g/^:wq$/d` |

Последние две команды были попыткой убрать случайные вставки. **Они не нужны для нормального выполнения квеста.**

## Почему команды оказались в конфиге

Редактор находился в режиме вставки. Поэтому:

```text
/STATUS
:wq
:1,4d
```

попадали в содержимое файла.

Копировать в редактор можно, но **нужно понимать текущий режим**.

## Предупреждение о swap-файле

Появилось:

```text
E325: ATTENTION
```

Был найден:

```text
.door_1.conf.swp
```

И указан работающий процесс редактора.

`.swp` — служебный файл Vim для восстановления. **Не нужно удалять его, пока исходный редактор работает.**

## Проверили приостановленные задания

```bash
jobs -l
```

Получили:

```text
[1]+ 2536186 Stopped vi ...
```

## Вернулись в редактор

```bash
fg %1
```

- `fg` возвращает задание на передний план;
- `%1` — номер задания из `jobs`, не PID.

`Ctrl+Z` приостанавливает программу, а не закрывает её.

## Вышли без сохранения последних вставок

Нажали:

```text
Ctrl+[
```

Затем набрали:

```text
:q!
```

И нажали Enter.

## Восстановили конфиг из Git

```bash
git restore -- src/door_management_files/door_configuration/door_1.conf
```

**Это отбрасывает незаписанные в индекс изменения выбранного файла.** В нашей ситуации команда убрала ошибочные правки и вернула исходный конфиг.

Не применять бездумно к файлам с нужными несохранёнными изменениями.

## Вторая попытка: nano — успешная

```bash
nano src/door_management_files/door_configuration/door_1.conf
```

Действия:

1. Стрелками перешли к `STATUS: CLOSED`.
2. Удалили `CLOSED`.
3. Ввели `OPEN`.
4. Нажали **Ctrl+O** — буква O, не цифра 0.
5. Нажали Enter для подтверждения имени.
6. Нажали **Ctrl+X** для выхода.

## Проверили результат

```bash
git diff -- src/door_management_files/door_configuration/door_1.conf
```

Получили правильное изменение:

```diff
-STATUS: CLOSED
+STATUS: OPEN
```

**Никакие остальные строки конфига менять не требовалось.**

## Создали `quest5.txt`

В нём записали 15 пронумерованных пунктов:

- запуск vi;
- предупреждение swap;
- `jobs -l`;
- `fg %1`;
- неудачные попытки редактирования;
- выход;
- восстановление через Git;
- запуск nano;
- изменение статуса;
- сохранение и выход;
- проверку результата.

---

# 8. Git — команды, которые использовали

## Проверить состояние

```bash
git status
```

Одинаковый вывод при повторном запуске — нормально. Команда показывает состояние, но не изменяет его.

### Значения сообщений

| Сообщение | Значение |
|---|---|
| `modified` | Отслеживаемый файл изменён |
| `deleted` | Отслеживаемый файл отсутствует по старому пути |
| `Untracked files` | Новые файлы ещё не добавлены |
| `Changes not staged` | Изменения ещё не подготовлены к коммиту |
| `Changes to be committed` | Изменения подготовлены |
| `working tree clean` | Нет незафиксированных изменений |
| `ahead ... by 1 commit` | Локальная ветка впереди известного состояния удалённой на один коммит |
| `up to date` | Локальная ветка совпадает с известным состоянием отслеживаемой ветки |

## Добавить конкретный файл

```bash
git add src/quest3.sh
```

```bash
git add src/quest4.sh
```

## Добавить два файла квеста 5

```bash
git add src/quest5.txt src/door_management_files/door_configuration/door_1.conf
```

## Добавить папку

```bash
git add src/door_management_files/
```

## Добавить все изменения, включая удаления

Мы использовали:

```bash
git add -A
```

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

Когда файлы переместили из `src/door_management_fi`, Git показывал старые пути как `deleted`. Это ожидаемо: для фиксации переноса нужны **и удаления старых путей, и добавления новых**.

## Посмотреть изменения до `git add`

```bash
git diff
```

## Посмотреть подготовленные изменения

```bash
git diff --cached
```

## Краткая статистика подготовленных изменений

```bash
git diff --cached --stat
```

Твой последний результат:

```text
door_1.conf | 2 +-
quest5.txt | 15 +++++++++++++++
```

Это означает:

- в конфиге одна строка удалена и одна добавлена;
- в журнал добавлены 15 строк.

## Создать коммит

```bash
git commit -m "Quest 5: open first door and document actions"
```

`-m` задаёт сообщение коммита.

Для предыдущих квестов использовались аналогичные команды с другими сообщениями.

## Отправить коммиты на сервер

```bash
git push
```

## Посмотреть историю коммитов

```bash
git log --oneline
```

Если открыт просмотрщик Git, выйти можно английской **`q`**.

---

# 9. История команд терминала

## Показать историю

```bash
history
```

## Найти команды создания папок и файлов

```bash
history | grep -E "(mkdir|touch)" | grep door_management
```

## Найти команды перемещения и изменения прав

```bash
history | grep -E "(mv|mkdir|cp|chmod)" | grep -E "(door_management|ai_door)" | tail -20
```

- `grep` отбирает подходящие строки;
- `-E` включает расширенные шаблоны;
- `tail -20` показывает только последние 20 строк.

**Моя прежняя ошибка:** по последним 20 строкам нельзя утверждать, что какой-то команды раньше не было.

Также `history`:

- хранит команды оболочки, но не каждое нажатие внутри редактора;
- может содержать ошибочно вставленный текст терминала;
- не гарантирует полную историю всех сеансов.

Поэтому журнал действий редактора записывали отдельно.

---

# 10. Горячие клавиши — короткая памятка

| Клавиши | Что делают |
|---|---|
| `Ctrl+C` | Прерывают программу на переднем плане / текущий ввод |
| `Ctrl+Z` | Приостанавливают программу |
| `Ctrl+Q` | Возобновляют вывод, если он был остановлен через Ctrl+S |
| `Ctrl+[` | Аналог Esc |
| `Ctrl+O` в nano | Сохранить файл |
| `Ctrl+X` в nano | Выйти |
| `Esc` в Vim | Выйти из режима вставки |
| `q` в просмотрщике Git | Закрыть просмотрщик |

Если случайно ввести `\` в конце команды и нажать Enter, оболочка может показать `>` и ждать продолжения. **Ctrl+C** отменяет такой ввод.

---

# 11. Что важно вынести из всей работы

1. **Читать ошибки, а не просто повторять запуск.**
2. **Сначала искать исходные файлы, потом создавать новые.**
3. **Путь скрипта и текущая рабочая папка — разные вещи.**
4. **Число файлов не означает, что конфигурация правильно восстановлена.**
5. **Логи `.log` — данные модуля; наши действия записывались в `quest*.sh` и `quest5.txt`.**
6. **PID — временный номер, его нельзя использовать повторно без проверки.**
7. **В Vim нужно различать режим ввода и режим команд.**
8. **Перед коммитом проверять `git diff` и список добавленных файлов.**
9. **Не запускать журнал прошлых действий вслепую.**

## Текущее подтверждённое состояние

- Квесты 3–4 были сохранены и отправлены на сервер.
- В квесте 5 статус первой двери правильно изменён на `OPEN`.
- `quest5.txt` создан.
- Оба файла квеста 5 подготовлены к коммиту.

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

```bash
git commit -m "Quest 5: open first door and document actions"
```

```bash
git push
```

```bash
git status
```