# Рабочая среда: терминал и первый файл с кодом<no value>

## В этом уроке

Урок состоит из двух коротких глав — в том же порядке, что и в презентации. Сами инструменты (Python, VS Code, Git и Docker) уже установлены в теме [Установка программ](/ru/docs/installations/01-installations/).

1. **Глава 1** — терминал, оболочка и базовые команды (PowerShell / Bash)
2. **Глава 2** — рабочая папка и первый файл на Python

## Глава 1: Терминал, оболочка и базовые команды (PowerShell / Bash)

### Что мы изучим?

- Разницу между **терминалом** и **оболочкой** (shell).
- Как устроена **команда**.
- Базовые команды, которыми каждый разработчик пользуется каждый день: перемещение, просмотр, создание, копирование, перемещение файлов, удаление.
- PowerShell (Windows) и Bash/Zsh (Mac/Linux).

### Зачем это нужно?

- **Git**, **установка пакетов** через `pip` и запуск **сервера** (темы бэкенда и баз данных) — всё это делается из терминала.
- У настоящих серверов в облаке **нет** графического интерфейса — только терминал.
- Когда привыкнешь, терминал работает **быстрее** мыши: одна команда может создать сразу 5 папок.

### Объяснение с основ

#### Терминал, оболочка, команда

Три понятия, которые поначалу путают:

| Понятие | Что это | Пример |
|---|---|---|
| **Терминал** | **Окно**: программа, которая показывает текст и принимает ввод с клавиатуры. | Windows Terminal, терминал VS Code, Terminal.app на Mac |
| **Оболочка (shell)** | **Интерпретатор**: программа, работающая внутри окна, которая читает то, что вы набрали, и выполняет это. | PowerShell, Bash, Zsh, cmd |
| **Команда** | Сама **инструкция**. | `cd week-1` |

{{< box "analogy" "Аналогия" >}}
**Терминал** — это телефон, **оболочка** — человек на другом конце провода, который понимает язык и делает то, о чём вы просите, а **команда** — фраза, которую вы говорите. Можно держать тот же телефон (терминал) и разговаривать с разными людьми, которые понимают разные языки (PowerShell или Bash).
{{< /box >}}

- **PowerShell** — современная оболочка Windows.
- **Bash** — распространённая оболочка в Linux. **Zsh** — оболочка по умолчанию на Mac, для базовых команд почти не отличается от Bash.
- **cmd** — старая оболочка Windows. Мы не будем ею пользоваться.

#### Приглашение (prompt)

**Приглашение** (prompt) — текст, который оболочка показывает, пока ждёт команду:

```text
PS C:\Users\dana\dev\kodkod6>        ← PowerShell: "PS" + current directory
dana@laptop:~/dev/kodkod6$           ← Bash: user@computer:directory$
```

`~` (тильда) в Bash = **домашняя папка** пользователя.

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

```text
command   argument(s)    flag(s)/option(s)
  cp      notes.txt  backup.txt
  ls      -la
  mkdir   week-2
```

- **Команда** — что сделать.
- **Аргумент** — с чем это сделать (файл, папка).
- **Флаг / опция** — как это сделать. В Bash: `-a` или `--all`. В PowerShell: `-Recurse`, `-Force`.
- Части разделяются пробелом. Поэтому имена с пробелами нужно брать в кавычки: `cd "My Folder"`. И это ещё одна причина не ставить пробелы в именах.

### Синтаксис

#### Главная таблица команд

| Действие | PowerShell | Bash / Zsh |
|---|---|---|
| Где я? | `pwd` | `pwd` |
| Что здесь есть? | `ls` (или `dir`) | `ls` |
| Включая скрытые файлы | `ls -Force` | `ls -a` |
| Войти в папку | `cd week-1` | `cd week-1` |
| На одну папку вверх | `cd ..` | `cd ..` |
| В домашнюю папку | `cd ~` | `cd ~` (или просто `cd`) |
| Создать папку | `mkdir week-2` | `mkdir week-2` |
| Создать пустой файл | `New-Item notes.txt` | `touch notes.txt` |
| Показать содержимое файла | `cat notes.txt` | `cat notes.txt` |
| Скопировать | `cp a.txt b.txt` | `cp a.txt b.txt` |
| Переместить / переименовать | `mv a.txt b.txt` | `mv a.txt b.txt` |
| Удалить файл | `rm notes.txt` | `rm notes.txt` |
| Удалить папку вместе с содержимым | `rm -r folder` | `rm -r folder` |
| Очистить экран | `cls` (или `clear`) | `clear` |
| Справка по команде | `Get-Help cp` | `man cp` (выход: `q`) |

В PowerShell `ls`, `cat`, `cp`, `mv`, `rm` — это **псевдонимы** (aliases) более длинных команд (`Get-ChildItem`, `Get-Content`, `Copy-Item`...). Так одни и те же базовые команды работают в обеих средах.

#### Сочетания клавиш, которые экономят часы

| Клавиша | Что делает |
|---|---|
| `Tab` | **Автодополнение** имён файлов и папок. Наберите `cd we` + Tab — и получите `cd week-1`. |
| `↑` / `↓` | Переход по предыдущим командам. |
| `Ctrl + C` | Остановить выполняющуюся команду. |
| `Ctrl + L` | Очистить экран. |

### Первый пример кода

Перемещаемся и проверяем. По ходу увидим, как меняется приглашение:

```powershell
pwd
cd ~
pwd
cd dev\kodkod6
ls
```

**Пример вывода:**

```text
Path
----
C:\Users\dana\dev\kodkod6\week-1

Path
----
C:\Users\dana

    Directory: C:\Users\dana\dev\kodkod6

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          06/10/2026     09:12                sandbox
d----          06/10/2026     08:40                week-1
```

### Разбор кода построчно

| Команда | Что произошло |
|---|---|
| `pwd` | **p**rint **w**orking **d**irectory: выводит, где мы находимся. |
| `cd ~` | Переход в домашнюю папку. |
| `pwd` | Подтверждает, что мы действительно перешли. |
| `cd dev\kodkod6` | Относительный путь: из домашней папки в `dev`, а затем в `kodkod6`. |
| `ls` | Показывает содержимое. В PowerShell `d` в столбце Mode обозначает каталог (папку). |

### Ещё один пример

Строим структуру папок **темы по Python** только командами, создаём файлы, копируем, переименовываем и удаляем:

```powershell
cd ~\dev\kodkod6
mkdir week-2
cd week-2
mkdir day-1, day-2, day-3
New-Item day-1\notes.txt
ls
cp day-1\notes.txt day-2\notes.txt
mv day-2\notes.txt day-2\summary.txt
ls day-2
rm day-1\notes.txt
cd ..
```

**В Bash/Zsh (Mac / Linux) — то же самое:**

```bash
cd ~/dev/kodkod6
mkdir week-2
cd week-2
mkdir day-1 day-2 day-3
touch day-1/notes.txt
ls
cp day-1/notes.txt day-2/notes.txt
mv day-2/notes.txt day-2/summary.txt
ls day-2
rm day-1/notes.txt
cd ..
```

**Разбор:**

- `mkdir day-1, day-2, day-3` — в PowerShell можно создать несколько папок сразу через запятую. В Bash — через пробел.
- `New-Item` / `touch` — создают пустой файл.
- `cp источник назначение` — **копирование**: источник остаётся, создаётся копия.
- `mv источник назначение` — **перемещение**. Если назначение в той же папке, но с другим именем, это на самом деле **переименование**.
- `rm` — **удаление**.
- `cd ..` — обратно в `kodkod6`.

### Типичная ошибка

**Ошибка: думать, что `rm` — это как «удалить» в проводнике.**

{{< box "warn" "rm не отправляет в корзину!" >}}
Файл, удалённый через `rm`, **удаляется навсегда**. Нет ни отмены, ни корзины. В частности: **никогда** не запускайте `rm -r` для пути, в котором вы не уверены, и никогда не копируйте из интернета команды, содержащие `rm -rf /` или `sudo rm`.
{{< /box >}}

**Безопасная привычка:** перед `rm` выполните `ls` для точно такого же пути и проверьте, что собираетесь удалить.

**Вторая ошибка — пробелы в именах:**

```powershell
cd My Projects
```

```text
Set-Location: A positional parameter cannot be found that accepts argument 'Projects'.
```

Оболочка увидела **два** аргумента: `My` и `Projects`. Исправление: `cd "My Projects"`. А ещё лучше с самого начала: `my-projects`.

**Третья ошибка — запуск кода на Python прямо в оболочке:**

```powershell
PS> print("hi")
```

`print` — команда **Python**, а не PowerShell. Она выполняется внутри Python: `python -c "print('hi')"` или внутри файла `.py`. И наоборот: `cd` не работает внутри файла Python.

### Итоги

- **Терминал** = окно. **Оболочка** = интерпретатор (PowerShell / Bash / Zsh). **Команда** = инструкция.
- Команда = имя + аргументы + флаги, разделённые пробелами.
- Перемещение: `pwd`, `ls`, `cd`, `cd ..`, `cd ~`.
- Файлы: `mkdir`, `New-Item` / `touch`, `cp`, `mv`, `rm`. И `rm` **не** отправляет в корзину.
- `Tab` для автодополнения, `↑` для предыдущей команды, `Ctrl + C` для остановки.

<!-- docs:start — generated by scripts/intro6/site_docs.py; edit the links there -->

### Официальная документация

- [VS Code — Terminal Basics](https://code.visualstudio.com/docs/terminal/basics)
- [PowerShell 101 — Getting started](https://learn.microsoft.com/en-us/powershell/scripting/learn/ps101/01-getting-started)
- [Set-Location (cd)](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-location)
- [GNU Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html)

<!-- docs:end -->

## Глава 2: Рабочая папка и первый файл на Python

### Что мы изучим?

- Зачем писать код **в файле** и что такое файл с кодом на самом деле.
- Как построить аккуратную **рабочую папку** (workspace) для всего курса.
- Что происходит при запуске файла: **интерпретатор** читает его сверху вниз.
- Что такое **текущая папка** и почему из-за неё возникает самая частая ошибка новичков.

### Зачем это нужно?

- Строка, набранная в терминале, исчезает, как только вы закрываете окно. Настоящая программа — это десятки и сотни строк, их нужно **сохранять**.
- На курсе мы напишем десятки файлов: упражнения, проекты, серверы. Без порядка через неделю ничего не найдёте. Профессиональные разработчики держат каждый проект в своей папке — именно так ожидают работать и Git, и VS Code: **проект = папка**.
- Многие ошибки новичков («файл не найден») возникают потому, что терминал находится в другой папке, чем файл.

### Объяснение с основ

#### Файл и папка

- **Файл** — единица информации, сохранённая на диске: документ, изображение или файл с кодом.
- **Папка / каталог** — «ящик», в котором лежат файлы и другие папки.
- **Путь** — полный адрес файла от корня до него. Например: `C:\dev\kodkod6\week-1\hello.py`.

#### Что такое файл с кодом на самом деле

| | |
|---|---|
| **Текст** | Файл с кодом — обычный текстовый файл, его можно открыть в любом текстовом редакторе. |
| **`.py`** | Расширение говорит операционной системе и VS Code: «это код на Python». VS Code видит его и включает подсветку синтаксиса и кнопку запуска. |
| **Интерпретатор** | Программа Python читает файл и выполняет его. Без неё файл — просто текст. |
| **Сверху вниз** | Выполнение начинается с первой строки и идёт строка за строкой до конца. |

#### Текущая папка

Терминал всегда «стоит» в одной папке — она видна слева от курсора (в **приглашении**):

```text
PS C:\dev\kodkod6\week-1>
```

Когда вы набираете `python hello.py`, Python ищет `hello.py` **только в текущей папке**. Если файл в другой папке — он его не найдёт.

{{< box "analogy" "Аналогия" >}}
Терминал похож на человека, который стоит в определённой комнате дома. Если попросить его «принести книгу с полки», он будет искать только на полке в той комнате, где стоит. Если книга в другой комнате, сначала нужно сказать ему перейти в другую комнату (команда `cd`) или дать полный адрес.
{{< /box >}}

### Рекомендуемая структура папок курса

```text
C:\dev\kodkod6\          (Mac: ~/dev/kodkod6/)
├── week-1\
│   └── hello.py
├── week-2\
├── week-3\
└── week-4\
```

- **Одна папка на весь курс** (`kodkod6`), а внутри — папка для каждой недели.
- Правила именования: **строчные английские буквы, без пробелов и без букв других алфавитов**. Вместо пробела — дефис `-` для папок и подчёркивание `_` для файлов Python (`my_file.py`). Пробелы и неанглийские символы в пути вызывают проблемы во многих инструментах.
- В VS Code открывайте **всю** папку `kodkod6` (**File → Open Folder**), а не отдельный файл.

### Как запустить файл

Допустим, в папке `week-1` есть файл `hello.py` с одной строкой, которая выводит `Hello, World!`. Преподаватель покажет запуск на экране:

```powershell
cd week-1
python hello.py
```

**Вывод:**

```text
Hello, World!
```

| Команда | Что делает |
|---|---|
| `cd week-1` | **c**hange **d**irectory — переводит терминал в папку, где лежит файл. |
| `python hello.py` | Запускает интерпретатор и передаёт ему файл. Он читает его сверху вниз и выполняет каждую строку. |

**Второй способ запуска: кнопка Run.** В VS Code, когда открыт файл `.py`, вверху справа есть треугольник ▷ (**Run Python File**). Нажатие открывает терминал и запускает файл по полному пути — поэтому `cd` не нужен.

### Типичная ошибка

**Ошибка: запуск не из той папки.**

```text
PS C:\dev\kodkod6> python hello.py
can't open file '...hello.py':
[Errno 2] No such file or directory
```

- Терминал стоит в `kodkod6`, а файл лежит в `kodkod6\week-1`.
- Python ищет файл **только в текущей папке**.
- **Исправление:** сначала `cd week-1`, и только потом запуск. Или запуск с путём: `python week-1\hello.py`.

**Вторая ошибка: не сохранить перед запуском.** Если на вкладке файла вместо ✕ виден кружок ⚪, файл не сохранён, и Python запустит старую версию. Полезно включить **File → Auto Save**.

### Итоги

- **Файл с кодом** — это текстовый файл. Расширение **`.py`** говорит, что это код на Python.
- **Проект = папка.** Английские имена, без пробелов: `kodkod6/week-1/hello.py`.
- **Интерпретатор** читает файл и выполняет его **сверху вниз**.
- **Текущая папка** — там, где стоит терминал, и именно там Python ищет файл.
- Запуск: `cd` в папку, затем `python file.py`, или кнопка ▷ в VS Code.

<!-- docs:start — generated by scripts/intro6/site_docs.py; edit the links there -->

### Официальная документация

- [Python Tutorial — Using the Python Interpreter](https://docs.python.org/3/tutorial/interpreter.html)
- [Command line and environment](https://docs.python.org/3/using/cmdline.html)
- [VS Code — Run Hello World](https://code.visualstudio.com/docs/python/python-tutorial#_run-python-code)

<!-- docs:end -->

<!-- exercises:start — generated by scripts/intro6/sync_site_exercises.py; edit scripts/intro6/exercises/ -->
## Практика

Вопросы на понимание материала урока — без кода.

### Упражнение 1: Терминал, оболочка или команда?

Для каждого предложения напишите, что оно описывает: **терминал**, **оболочку** или **команду**:

1. Окно, в котором печатают и видят вывод.
2. `mkdir week-2`
3. PowerShell в Windows или Bash в Mac и Linux.
4. Программа, которая понимает, что мы набрали, и выполняет это.
5. `cd ..`

{{< solution >}}
1. **Терминал** — окно.
2. **Команда** — одна инструкция: создать папку.
3. **Оболочка** — это названия разных оболочек.
4. **Оболочка** — «мозг», который разбирает и выполняет команды.
5. **Команда** — одна инструкция: перейти на одну папку вверх.

Правило: **терминал** — это окно, **оболочка** — программа, работающая внутри него, а **команда** — то, что вы печатаете.
{{< /solution >}}

### Упражнение 2: Какой полный путь?

Структура папок курса:

```text
C:\dev\kodkod6\
├── week-1\
│   └── hello.py
└── week-2\
```

1. Какой полный путь у файла `hello.py`?
2. Терминал стоит в `C:\dev\kodkod6\week-2`. Какая команда вернёт его в `kodkod6`?
3. Почему полезно держать все файлы курса в одной папке, а не на рабочем столе?

{{< solution >}}
1. `C:\dev\kodkod6\week-1\hello.py`
2. `cd ..` — две точки = на одну папку вверх.
3. Когда всё лежит в `kodkod6`, любой файл легко найти даже через месяц, пути короткие и без пробелов, а весь курс можно сразу открыть в VS Code.
{{< /solution >}}

### Упражнение 3: Как устроена команда

В каждой из следующих команд — что является именем команды, что аргументом, а что флагом (если есть)?

```text
git --version
cp notes.txt backup.txt
ls -la
mkdir week-2
```

{{< solution >}}
| Команда | Имя команды | Аргументы | Флаг |
|---|---|---|---|
| `git --version` | `git` | — | `--version` |
| `cp notes.txt backup.txt` | `cp` | `notes.txt`, `backup.txt` | — |
| `ls -la` | `ls` | — | `-la` |
| `mkdir week-2` | `mkdir` | `week-2` | — |

Правило: **команда** = что сделать, **аргумент** = с чем это сделать, **флаг** = как (изменение поведения, начинается с дефиса).
{{< /solution >}}

### Упражнение 4: Перемещение по папкам

Терминал стоит в `C:\dev\kodkod6`. Напишите последовательность команд, которая делает следующее, по порядку:

1. Создаёт папку `week-1`.
2. Входит в неё.
3. Показывает, где сейчас стоит терминал.
4. Возвращается на одну папку вверх.

{{< solution >}}
```powershell
mkdir week-1
cd week-1
pwd
cd ..
```

- `mkdir` — создать папку.
- `cd week-1` — перейти в папку.
- `pwd` — выводит текущий путь: `C:\dev\kodkod6\week-1`.
- `cd ..` — две точки = на одну папку вверх.
{{< /solution >}}

### Упражнение 5: «No such file or directory»

Файл `hello.py` лежит в `C:\dev\kodkod6\week-1`. Студент запускает:

```text
PS C:\dev\kodkod6> python hello.py
can't open file '...hello.py': [Errno 2] No such file or directory
```

1. Почему Python не находит файл, если он существует?
2. Назовите два способа это исправить.

{{< solution >}}
1. Python ищет файл **только в текущей папке** — там, где стоит терминал (`kodkod6`). Файл лежит во вложенной папке `week-1`, поэтому он не найден.
2. Два способа:
   - Сначала перейти в папку: `cd week-1`, а затем `python hello.py`.
   - Запустить с путём: `python week-1\hello.py`.

(Третий вариант: кнопка ▷ Run в VS Code, которая запускает файл по полному пути.)
{{< /solution >}}

<!-- exercises:end -->
