Загрузка данных
Ниже — **общий конспект по квестам 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
```