# סביבת העבודה: Terminal וקובץ קוד ראשון<no value>


## מה בשיעור

השיעור הזה בנוי משני פרקים קצרים, באותו סדר כמו במצגת. את הכלים עצמם (Python, VS Code, Git ו-Docker) כבר התקנו בנושא [התקנות](/docs/installations/01-installations/).

1. **פרק ראשון** — Terminal, Shell ופקודות בסיסיות (PowerShell / Bash)
2. **פרק שני** — תיקיית עבודה וקובץ Python ראשון

## פרק ראשון: Terminal, Shell ופקודות בסיסיות (PowerShell / Bash)

### מה נלמד?

- מה ההבדל בין **Terminal** ל-**Shell**.
- איך בנויה **פקודה**.
- פקודות הבסיס שכל מפתח משתמש בהן כל יום: ניווט, הצגה, יצירה, העתקה, העברה, מחיקה.
- PowerShell (Windows) מול Bash/Zsh (Mac/Linux).

### למה צריך את זה?

- **Git** (נושא Python), **התקנת חבילות** עם `pip`, והרצת **שרת** (נושא Backend ומסדי נתונים) נעשים מה-Terminal.
- על שרתים אמיתיים בענן **אין** ממשק גרפי, יש רק Terminal.
- מהרגע שמתרגלים, Terminal **מהיר** יותר מעכבר: פקודה אחת יכולה ליצור 5 תיקיות בבת אחת.

### הסבר מהבסיס

#### Terminal, Shell, Command

שלושה מושגים שמבלבלים בהתחלה:

| מושג | מה זה | דוגמה |
|---|---|---|
| **Terminal** | ה**חלון**: התוכנה שמציגה טקסט ומקבלת מקלדת. | Windows Terminal, ה-Terminal של VS Code, Terminal.app במק |
| **Shell** | ה**מפרש**: התוכנה שרצה בתוך החלון, קוראת את מה שהקלדתם ומבצעת. | PowerShell, Bash, Zsh, cmd |
| **Command** | ה**פקודה** עצמה. | `cd week-1` |

{{< box "analogy" "אנלוגיה" >}}
**Terminal** הוא הטלפון, **Shell** הוא האדם בצד השני שמבין את השפה ומבצע, **Command** הוא המשפט שאתם אומרים. אפשר להחזיק אותו טלפון (Terminal) ולדבר עם אנשים שונים שמבינים שפות שונות (PowerShell או Bash).
{{< /box >}}

- **PowerShell** — ה-Shell המודרני של Windows.
- **Bash** — ה-Shell הנפוץ בלינוקס. **Zsh** — ברירת המחדל במק, וכמעט זהה ל-Bash בפקודות הבסיס.
- **cmd** — ה-Shell הישן של Windows. לא נשתמש בו.

#### ה-Prompt

ה-**Prompt** הוא הטקסט שה-Shell מציג כשהוא מחכה לפקודה:

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

`~` (טילדה) בבאש = **תיקיית הבית** של המשתמש.

#### מבנה של פקודה

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

- **Command** — מה לעשות.
- **Argument** — על מה לעשות (קובץ, תיקייה).
- **Flag / Option** — איך לעשות. בבאש: `-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` | ניקוי מסך. |

### דוגמת קוד ראשונה

ניווט ובדיקה. בדרך נראה את ה-Prompt משתנה:

```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 מסמן Directory (תיקייה). |

### דוגמה נוספת

נבנה את מבנה התיקיות של **נושא 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 ..
```

**בבאש/זד-שֶל (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 אפשר ליצור כמה תיקיות בבת אחת עם פסיקים. בבאש — עם רווחים.
- `New-Item` / `touch` — יוצרים קובץ ריק.
- `cp מקור יעד` — **העתקה**: המקור נשאר, ונוצר עותק.
- `mv מקור יעד` — **העברה**. אם היעד באותה תיקייה עם שם אחר, זה בעצם **שינוי שם**.
- `rm` — **מחיקה**.
- `cd ..` — חזרה ל-`kodkod6`.

### טעות נפוצה

**הטעות: `rm` חושב שזה כמו "מחק" בסייר הקבצים.**

{{< box "warn" "rm לא שולח לסל המחזור!" >}}
קובץ שנמחק עם `rm` **נמחק לצמיתות**. אין Undo ואין Recycle Bin. ובמיוחד: **לעולם** אל תריצו `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'.
```

ה-Shell ראה **שני** ארגומנטים: `My` ו-`Projects`. התיקון: `cd "My Projects"`. ועדיף מראש: `my-projects`.

**טעות שלישית — להריץ קוד Python בתוך ה-Shell:**

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

`print` היא פקודה של **Python**, לא של PowerShell. שם הפקודה מורץ בתוך Python: `python -c "print('hi')"`, או בתוך קובץ `.py`. וההפך, `cd` לא עובד בתוך קובץ Python.

### סיכום

- **Terminal** = החלון. **Shell** = המפרש (PowerShell / Bash / Zsh). **Command** = הפקודה.
- פקודה = שם + ארגומנטים + דגלים, מופרדים ברווחים.
- ניווט: `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) — ה-Terminal המובנה של VS Code
- [PowerShell 101 — Getting started](https://learn.microsoft.com/en-us/powershell/scripting/learn/ps101/01-getting-started) — היכרות עם PowerShell
- [Set-Location (cd)](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-location) — הפקודה cd ב-PowerShell
- [GNU Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html) — המדריך הרשמי של Bash

<!-- docs:end -->

## פרק שני: תיקיית עבודה וקובץ Python ראשון

### מה נלמד?

- למה כותבים קוד **בקובץ**, ומה זה בעצם קובץ קוד.
- איך בונים **תיקיית עבודה** (Workspace Folder) מסודרת לכל הקורס.
- מה קורה כשמריצים קובץ: ה-**Interpreter** קורא אותו מלמעלה למטה.
- מה זה **התיקייה הנוכחית** (Current Directory), ולמה היא הסיבה לשגיאה הנפוצה ביותר של מתחילים.

### למה צריך את זה?

- שורה אחת שמקלידים ב-Terminal נעלמת ברגע שסוגרים את החלון. תוכנית אמיתית היא עשרות ומאות שורות — צריך **לשמור** אותן.
- בקורס נכתוב עשרות קבצים: תרגילים, פרויקטים, שרתים. בלי סדר, אחרי שבוע כבר לא תמצאו כלום. מפתחים מקצועיים שומרים כל פרויקט בתיקייה משלו — וזו גם הדרך שבה Git ו-VS Code מצפים לעבוד: **פרויקט = תיקייה**.
- הרבה שגיאות של מתחילים ("הקובץ לא נמצא") נובעות מכך שה-Terminal נמצא בתיקייה אחרת מזו של הקובץ.

### הסבר מהבסיס

#### קובץ ותיקייה

- **קובץ** (File) — יחידת מידע ששמורה על הדיסק: מסמך, תמונה, או קובץ קוד.
- **תיקייה** (Folder / Directory) — "מגירה" שמכילה קבצים ותיקיות נוספות.
- **נתיב** (Path) — הכתובת המלאה של קובץ, מהשורש ועד אליו. למשל: `C:\dev\kodkod6\week-1\hello.py`.

#### מה זה בעצם קובץ קוד

| | |
|---|---|
| **Text** | קובץ קוד הוא קובץ טקסט רגיל — אפשר לפתוח אותו בכל עורך טקסט. |
| **`.py`** | הסיומת אומרת למערכת ההפעלה ול-VS Code: "זה קוד Python". VS Code רואה אותה ומפעיל צביעת תחביר וכפתור הרצה. |
| **Interpreter** | תוכנת Python קוראת את הקובץ ומבצעת אותו. בלעדיה, הקובץ הוא סתם טקסט. |
| **Top to Bottom** | הביצוע מתחיל בשורה הראשונה וממשיך שורה אחרי שורה עד הסוף. |

#### "התיקייה הנוכחית" (Current Directory)

ה-Terminal תמיד "עומד" בתיקייה אחת — היא מופיעה משמאל לסמן (ה-**Prompt**):

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

כשכותבים `python hello.py`, Python מחפשת את `hello.py` **בתיקייה הנוכחית בלבד**. אם הקובץ בתיקייה אחרת — היא לא תמצא אותו.

{{< box "analogy" "אנלוגיה" >}}
ה-Terminal הוא כמו אדם שעומד בחדר מסוים בבית. אם תבקשו ממנו "תביא את הספר מהמדף" — הוא יחפש רק במדף שבחדר שבו הוא עומד. אם הספר בחדר אחר, צריך קודם להגיד לו לעבור חדר (פקודת `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 — מעבירה את ה-Terminal לתיקייה שבה הקובץ נמצא. |
| `python hello.py` | מפעילה את ה-Interpreter ומוסרת לו את הקובץ. הוא קורא אותו מלמעלה למטה ומבצע כל שורה. |

**דרך הרצה שנייה: כפתור Run.** ב-VS Code, כשקובץ `.py` פתוח, יש למעלה מימין משולש ▷ (**Run Python File**). לחיצה עליו פותחת Terminal ומריצה את הקובץ עם הנתיב המלא שלו — ולכן לא צריך `cd`.

### טעות נפוצה

**הטעות: להריץ מהתיקייה הלא נכונה.**

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

- ה-Terminal עומד ב-`kodkod6`, והקובץ נמצא ב-`kodkod6\week-1`.
- Python מחפשת את הקובץ **רק בתיקייה הנוכחית**.
- **הפתרון:** קודם `cd week-1`, ורק אז להריץ. או להריץ עם הנתיב: `python week-1\hello.py`.

**טעות שנייה: לא לשמור לפני הרצה.** אם בלשונית של הקובץ יש עיגול ⚪ במקום ✕, הקובץ לא נשמר, ו-Python תריץ את הגרסה הישנה. מומלץ להפעיל **File → Auto Save**.

### סיכום

- **קובץ קוד** הוא קובץ טקסט. הסיומת **`.py`** אומרת שזה קוד Python.
- **פרויקט = תיקייה.** שמות באנגלית, בלי רווחים: `kodkod6/week-1/hello.py`.
- ה-**Interpreter** קורא את הקובץ ומבצע אותו **מלמעלה למטה**.
- **התיקייה הנוכחית** היא המקום שבו ה-Terminal עומד — ושם 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) — איך מפעילים את Python מה-Terminal
- [Command line and environment](https://docs.python.org/3/using/cmdline.html) — python file.py — הרצת קובץ
- [VS Code — Run Hello World](https://code.visualstudio.com/docs/python/python-tutorial#_run-python-code) — הרצת קובץ Python ראשון ב-VS Code

<!-- docs:end -->

<!-- exercises:start — generated by scripts/intro6/sync_site_exercises.py; edit scripts/intro6/exercises/ -->
## תרגול

שאלות הבנה על החומר של השיעור — בלי קוד.

### תרגיל 1: Terminal, Shell או Command?

לכל משפט כתבו אם הוא מתאר **Terminal**, **Shell** או **Command**:

1. החלון שבו מקלידים ורואים את הפלט.
2. `mkdir week-2`
3. PowerShell ב-Windows, או Bash ב-Mac וב-Linux.
4. התוכנה שמבינה את מה שהקלדנו ומבצעת אותו.
5. `cd ..`

{{< solution >}}
1. **Terminal** — החלון.
2. **Command** — הוראה אחת: יצירת תיקייה.
3. **Shell** — אלה שמות של Shell-ים שונים.
4. **Shell** — "המוח" שמפרש ומבצע את הפקודות.
5. **Command** — הוראה אחת: מעבר תיקייה אחת למעלה.

הכלל: ה-**Terminal** הוא החלון, ה-**Shell** הוא התוכנה שרצה בתוכו, ו-**Command** הוא מה שמקלידים.
{{< /solution >}}

### תרגיל 2: מה הנתיב המלא?

מבנה התיקיות של הקורס:

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

1. מה הנתיב המלא של הקובץ `hello.py`?
2. ה-Terminal עומד ב-`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: ניווט בתיקיות

ה-Terminal עומד ב-`C:\dev\kodkod6`. כתבו את רצף הפקודות שעושה את הדברים הבאים, לפי הסדר:

1. יוצר תיקייה בשם `week-1`.
2. נכנס אליה.
3. מציג איפה ה-Terminal עומד עכשיו.
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 מחפשת את הקובץ **רק בתיקייה הנוכחית** — התיקייה שבה ה-Terminal עומד (`kodkod6`). הקובץ נמצא בתת-תיקייה `week-1`, ולכן הוא לא נמצא.
2. שתי דרכים:
   - לעבור קודם לתיקייה: `cd week-1`, ואז `python hello.py`.
   - להריץ עם הנתיב: `python week-1\hello.py`.

(אפשרות שלישית: כפתור ▷ Run ב-VS Code, שמריץ עם הנתיב המלא של הקובץ.)
{{< /solution >}}

<!-- exercises:end -->
