# Linux and the Shell ## What "Linux" actually means Linux is a **kernel** — the core piece of software from Module 1 that manages CPU, memory, and storage. What most people call "a Linux system" (Ubuntu, Debian, Fedora, Alpine...) is a **distribution**: the Linux kernel plus a chosen set of standard tools, package manager, and configuration conventions layered on top. Different distributions, same kernel underneath — which is why a command you learn on Ubuntu mostly still works on Alpine. ## Shell vs. terminal These get used interchangeably but are different things: - The **terminal** is the window/program that displays text and sends your keystrokes somewhere. - The **shell** is the program actually interpreting what you type as commands — `bash` is the shell this Lab uses. The terminal is just the display; the shell is the brain. ## Command structure Every command follows roughly the same shape: ``` command [options] [arguments] ``` `ls -la /var/log` — `ls` is the command, `-la` are options (flags) that change its behavior, `/var/log` is the argument (what to act on). Options can usually be combined (`-l -a` = `-la`). ## Exit codes: how a command reports success or failure Every command returns a number when it finishes: `0` means success, anything else (1-255) means some kind of failure. This isn't a Linux quirk — it's the exact mechanism scripts, CI pipelines, and (much later) Kubernetes health checks all rely on to know whether something worked. You can read the last command's exit code with the special variable `$?`. ## Getting help without leaving the terminal - **Tab completion** — press Tab while typing a command or path; the shell completes it for you or shows you the options. This is a genuine time-saver, not just a convenience. - **Command history** — press the Up arrow to recall previous commands; `history` lists them. - **`man `** — the manual page for almost any command, with every option explained. `man ls`, `man grep`, `man chmod` are all real, useful references — reaching for `man` before a search engine is a habit worth building now. ## Instructor Notes **Lesson goal:** Establish shell fluency vocabulary (shell vs. terminal, exit codes, options vs. arguments) that every later module assumes without re-explaining. **Approximate timing:** 15 minutes read; 10 minutes live with a short live demo of tab completion and `man`. **Common misconception to watch for:** students often think "Linux" and "the terminal" are the same thing — clarify the kernel/distribution/shell/terminal layering explicitly. **Demo idea:** live-type a command that fails (e.g. `ls /nonexistent`), then run `echo $?` immediately after to show the exit code in real time — more convincing than describing it.