366 lines
13 KiB
Plaintext
366 lines
13 KiB
Plaintext
|
|
---
|
|||
|
|
title: "Unix Basics"
|
|||
|
|
format:
|
|||
|
|
revealjs:
|
|||
|
|
theme: beige
|
|||
|
|
transition: fade
|
|||
|
|
width: 1280
|
|||
|
|
height: 720
|
|||
|
|
center: true
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Why Learn Unix?
|
|||
|
|
|
|||
|
|
- Foundational philosophy for modern computing
|
|||
|
|
- Powers most of the digital world
|
|||
|
|
- Born at AT&T's Bell Labs in late 1960s
|
|||
|
|
- Design principles: simplicity, modularity
|
|||
|
|
|
|||
|
|
## Unix Today
|
|||
|
|
|
|||
|
|
- **Certified Unix**: macOS
|
|||
|
|
- **Unix-like Systems**: GNU/Linux, BSD variants
|
|||
|
|
- **Linux**: Dominant Unix-like OS
|
|||
|
|
- Understanding Unix = understanding DNA of modern OS
|
|||
|
|
|
|||
|
|
## Unix System Overview
|
|||
|
|
|
|||
|
|
**Multi-user, Multitasking Operating System**
|
|||
|
|
|
|||
|
|
```{mermaid}
|
|||
|
|
graph TD
|
|||
|
|
A[OS Kernel] --> B[User 1 Process]
|
|||
|
|
A --> C[User 2 Process]
|
|||
|
|
A --> D[User 3 Process]
|
|||
|
|
B --> E[File System]
|
|||
|
|
C --> E
|
|||
|
|
D --> E
|
|||
|
|
style A fill:#2e86ab,color:#fff
|
|||
|
|
style B fill:#a23b72,color:#fff
|
|||
|
|
style C fill:#f18f01,color:#fff
|
|||
|
|
style D fill:#c73e1d,color:#fff
|
|||
|
|
style E fill:#3c8d5f,color:#fff
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## File System Structure
|
|||
|
|
|
|||
|
|
**Hierarchical Tree Organization**
|
|||
|
|
|
|||
|
|
```{mermaid}
|
|||
|
|
graph TD
|
|||
|
|
Root[/] --> etc["/etc<br/>config files"]
|
|||
|
|
Root --> home["/home<br/>user directories"]
|
|||
|
|
Root --> usr["/usr<br/>system software"]
|
|||
|
|
Root --> var["/var<br/>variable data"]
|
|||
|
|
home --> user1[/user1/]
|
|||
|
|
home --> user2[/user2/]
|
|||
|
|
user1 --> docs[Documents]
|
|||
|
|
user1 --> downloads[Downloads]
|
|||
|
|
|
|||
|
|
style Root fill:#2e86ab,color:#fff;
|
|||
|
|
style etc fill:#a23b72,color:#fff;
|
|||
|
|
style home fill:#f18f01,color:#fff;
|
|||
|
|
style usr fill:#c73e1d,color:#fff;
|
|||
|
|
style var fill:#3c8d5f,color:#fff;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## File Naming Rules
|
|||
|
|
|
|||
|
|
**Allowed Characters:**
|
|||
|
|
|
|||
|
|
- Letters (a-z, A-Z), Numbers (0-9)
|
|||
|
|
- Recommended: `.`, `%`, `-`, `_`, `:`, `=`
|
|||
|
|
|
|||
|
|
**Key Rules:**
|
|||
|
|
|
|||
|
|
- **Case sensitive**: `File.txt` ≠ `file.txt` ≠ `FILE.TXT`
|
|||
|
|
- **No leading dash**: `-file` causes issues (use `./-file`)
|
|||
|
|
- **Hidden files**: Start with `.` (e.g., `.bashrc`)
|
|||
|
|
|
|||
|
|
**Best Practices:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
good_file.txt # Clear and safe
|
|||
|
|
data-set-01.csv # Descriptive with hyphens
|
|||
|
|
project_config # No extension needed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Globbing - Pattern Matching
|
|||
|
|
|
|||
|
|
**Wildcard Characters:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
* # Any sequence of characters
|
|||
|
|
? # Any single character
|
|||
|
|
[abc] # Any character in set
|
|||
|
|
[a-z] # Any character in range
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Practical Examples:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ls *.txt # All text files
|
|||
|
|
ls report?.pdf # report1.pdf, reportA.pdf
|
|||
|
|
ls [abc]*.log # a.log, b_data.log, c-backup.log
|
|||
|
|
ls image[0-9].jpg # image0.jpg through image9.jpg
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Advanced Globbing
|
|||
|
|
|
|||
|
|
**Combining Patterns:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ls *.{txt,md} # All .txt AND .md files
|
|||
|
|
ls project_{dev,prod} # project_dev, project_prod
|
|||
|
|
ls file[!0-9]* # Files NOT starting with digit
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Use in Commands:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cp *.txt backup/ # Copy all text files
|
|||
|
|
rm temp_*.log # Remove temporary logs
|
|||
|
|
chmod +x *.sh # Make all scripts executable
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Pattern Expansion:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
echo *.py # Shows what patterns match
|
|||
|
|
ls data_202{3,4}*.csv # Multiple year patterns
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Globbing vs Regular Expressions
|
|||
|
|
|
|||
|
|
**Key Differences:**
|
|||
|
|
|
|||
|
|
- **Globbing**: File matching (`ls *.txt`)
|
|||
|
|
- **Regex**: Text pattern matching (`grep "^A" file.txt`)
|
|||
|
|
|
|||
|
|
**Remember:** Globbing happens **before** command execution!
|
|||
|
|
|
|||
|
|
## File Permissions
|
|||
|
|
|
|||
|
|
**Three categories × Three rights**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
-rwxr-xr-- # Owner: read, write, execute
|
|||
|
|
# Group: read, execute
|
|||
|
|
# Others: read only
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```{=html}
|
|||
|
|
<svg viewBox="0 0 600 200" xmlns="http://www.w3.org/2000/svg">
|
|||
|
|
<defs>
|
|||
|
|
<pattern id="read" patternUnits="userSpaceOnUse" width="10" height="10">
|
|||
|
|
<rect width="10" height="10" fill="#2e86ab" opacity="0.3"/>
|
|||
|
|
<line x1="0" y1="0" x2="10" y2="10" stroke="#2e86ab" stroke-width="1"/>
|
|||
|
|
</pattern>
|
|||
|
|
<pattern id="write" patternUnits="userSpaceOnUse" width="10" height="10">
|
|||
|
|
<rect width="10" height="10" fill="#a23b72" opacity="0.3"/>
|
|||
|
|
<rect x="2" y="2" width="6" height="6" fill="#a23b72" opacity="0.6"/>
|
|||
|
|
</pattern>
|
|||
|
|
<pattern id="execute" patternUnits="userSpaceOnUse" width="10" height="10">
|
|||
|
|
<rect width="10" height="10" fill="#f18f01" opacity="0.3"/>
|
|||
|
|
<circle cx="5" cy="5" r="3" fill="#f18f01" opacity="0.6"/>
|
|||
|
|
</pattern>
|
|||
|
|
</defs>
|
|||
|
|
|
|||
|
|
<!-- Owner Permissions -->
|
|||
|
|
<g transform="translate(50, 50)">
|
|||
|
|
<rect x="0" y="0" width="150" height="100" fill="#2e86ab" opacity="0.1" stroke="#2e86ab" stroke-width="2"/>
|
|||
|
|
<text x="75" y="30" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="16" fill="#2e86ab">Owner</text>
|
|||
|
|
<g transform="translate(40, 50)">
|
|||
|
|
<rect x="0" y="0" width="20" height="20" fill="url(#read)"/>
|
|||
|
|
<text x="10" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#2e86ab">r</text>
|
|||
|
|
<rect x="30" y="0" width="20" height="20" fill="url(#write)"/>
|
|||
|
|
<text x="40" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#a23b72">w</text>
|
|||
|
|
<rect x="60" y="0" width="20" height="20" fill="url(#execute)"/>
|
|||
|
|
<text x="70" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#f18f01">x</text>
|
|||
|
|
</g>
|
|||
|
|
</g>
|
|||
|
|
|
|||
|
|
<!-- Group Permissions -->
|
|||
|
|
<g transform="translate(225, 50)">
|
|||
|
|
<rect x="0" y="0" width="150" height="100" fill="#a23b72" opacity="0.1" stroke="#a23b72" stroke-width="2"/>
|
|||
|
|
<text x="75" y="30" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="16" fill="#a23b72">Group</text>
|
|||
|
|
<g transform="translate(40, 50)">
|
|||
|
|
<rect x="0" y="0" width="20" height="20" fill="url(#read)"/>
|
|||
|
|
<text x="10" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#2e86ab">r</text>
|
|||
|
|
<rect x="30" y="0" width="20" height="20" fill="#f5f5f5" stroke="#ccc" stroke-width="1"/>
|
|||
|
|
<text x="40" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#999">-</text>
|
|||
|
|
<rect x="60" y="0" width="20" height="20" fill="url(#execute)"/>
|
|||
|
|
<text x="70" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#f18f01">x</text>
|
|||
|
|
</g>
|
|||
|
|
</g>
|
|||
|
|
|
|||
|
|
<!-- Others Permissions -->
|
|||
|
|
<g transform="translate(400, 50)">
|
|||
|
|
<rect x="0" y="0" width="150" height="100" fill="#f18f01" opacity="0.1" stroke="#f18f01" stroke-width="2"/>
|
|||
|
|
<text x="75" y="30" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="16" fill="#f18f01">Others</text>
|
|||
|
|
<g transform="translate(40, 50)">
|
|||
|
|
<rect x="0" y="0" width="20" height="20" fill="url(#read)"/>
|
|||
|
|
<text x="10" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#2e86ab">r</text>
|
|||
|
|
<rect x="30" y="0" width="20" height="20" fill="#f5f5f5" stroke="#ccc" stroke-width="1"/>
|
|||
|
|
<text x="40" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#999">-</text>
|
|||
|
|
<rect x="60" y="0" width="20" height="20" fill="#f5f5f5" stroke="#ccc" stroke-width="1"/>
|
|||
|
|
<text x="70" y="35" text-anchor="middle" font-family="monospace" font-size="12" fill="#999">-</text>
|
|||
|
|
</g>
|
|||
|
|
</g>
|
|||
|
|
</svg>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Process Concept
|
|||
|
|
|
|||
|
|
**Program vs Process**
|
|||
|
|
|
|||
|
|
```{=html}
|
|||
|
|
<svg viewBox="0 0 500 200" xmlns="http://www.w3.org/2000/svg">
|
|||
|
|
<defs>
|
|||
|
|
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
|||
|
|
<polygon points="0 0, 10 3.5, 0 7" fill="#2e86ab"/>
|
|||
|
|
</marker>
|
|||
|
|
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
|||
|
|
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-color="#000000" flood-opacity="0.3"/>
|
|||
|
|
</filter>
|
|||
|
|
</defs>
|
|||
|
|
|
|||
|
|
<!-- Program (Static) -->
|
|||
|
|
<g transform="translate(50, 50)">
|
|||
|
|
<rect x="0" y="0" width="180" height="100" rx="10" fill="#2e86ab" filter="url(#shadow)"/>
|
|||
|
|
<rect x="5" y="5" width="170" height="90" rx="8" fill="#ffffff"/>
|
|||
|
|
<text x="90" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="18" fill="#2e86ab">Program</text>
|
|||
|
|
<text x="90" y="60" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#666">Static Code</text>
|
|||
|
|
<text x="90" y="80" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#888">(On Disk)</text>
|
|||
|
|
</g>
|
|||
|
|
|
|||
|
|
<!-- Arrow -->
|
|||
|
|
<path d="M 240 100 L 310 100" stroke="#2e86ab" stroke-width="3" marker-end="url(#arrowhead)"/>
|
|||
|
|
<text x="275" y="95" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#2e86ab">execution</text>
|
|||
|
|
|
|||
|
|
<!-- Process (Dynamic) -->
|
|||
|
|
<g transform="translate(320, 50)">
|
|||
|
|
<rect x="0" y="0" width="180" height="100" rx="10" fill="#a23b72" filter="url(#shadow)"/>
|
|||
|
|
<rect x="5" y="5" width="170" height="90" rx="8" fill="#ffffff"/>
|
|||
|
|
<text x="90" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="18" fill="#a23b72">Process</text>
|
|||
|
|
<text x="90" y="60" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#666">Running Instance</text>
|
|||
|
|
<text x="90" y="80" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#888">(In Memory)</text>
|
|||
|
|
</g>
|
|||
|
|
</svg>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Shell Environment
|
|||
|
|
|
|||
|
|
**Your Command Interface**
|
|||
|
|
|
|||
|
|
```{=html}
|
|||
|
|
<svg viewBox="0 0 500 250" xmlns="http://www.w3.org/2000/svg">
|
|||
|
|
<defs>
|
|||
|
|
<filter id="shellShadow" x="-20%" y="-20%" width="140%" height="140%">
|
|||
|
|
<feDropShadow dx="3" dy="3" stdDeviation="4" flood-color="#000000" flood-opacity="0.2"/>
|
|||
|
|
</filter>
|
|||
|
|
</defs>
|
|||
|
|
|
|||
|
|
<!-- Main Shell Container -->
|
|||
|
|
<rect x="100" y="30" width="300" height="160" rx="15" fill="#f8f9fa" stroke="#2e86ab" stroke-width="3" filter="url(#shellShadow)"/>
|
|||
|
|
|
|||
|
|
<!-- Shell Title -->
|
|||
|
|
<text x="250" y="60" text-anchor="middle" font-family="Arial, sans-serif" font-weight="bold" font-size="20" fill="#2e86ab">Shell Environment</text>
|
|||
|
|
|
|||
|
|
<!-- Command Input Area -->
|
|||
|
|
<rect x="130" y="80" width="240" height="30" rx="5" fill="#ffffff" stroke="#a23b72" stroke-width="2"/>
|
|||
|
|
<text x="140" y="100" text-anchor="start" font-family="monospace" font-size="14" fill="#333">$ ls -l *.txt</text>
|
|||
|
|
|
|||
|
|
<!-- Input Source -->
|
|||
|
|
<g transform="translate(50, 150)">
|
|||
|
|
<rect x="0" y="0" width="80" height="40" rx="8" fill="#2e86ab" opacity="0.8"/>
|
|||
|
|
<text x="40" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#fff">Keyboard</text>
|
|||
|
|
<text x="40" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#fff">Input</text>
|
|||
|
|
</g>
|
|||
|
|
|
|||
|
|
<!-- Output Destination -->
|
|||
|
|
<g transform="translate(370, 150)">
|
|||
|
|
<rect x="0" y="0" width="80" height="40" rx="8" fill="#a23b72" opacity="0.8"/>
|
|||
|
|
<text x="40" y="20" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#fff">Terminal</text>
|
|||
|
|
<text x="40" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#fff">Output</text>
|
|||
|
|
</g>
|
|||
|
|
|
|||
|
|
<!-- Arrows -->
|
|||
|
|
<path d="M 130 150 L 180 120" stroke="#2e86ab" stroke-width="2" marker-end="url(#arrowhead)"/>
|
|||
|
|
<path d="M 320 120 L 370 150" stroke="#a23b72" stroke-width="2" marker-end="url(#arrowhead)"/>
|
|||
|
|
|
|||
|
|
<!-- Process Execution -->
|
|||
|
|
<rect x="200" y="120" width="100" height="40" rx="5" fill="#f18f01" opacity="0.8"/>
|
|||
|
|
<text x="250" y="140" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#fff">Process</text>
|
|||
|
|
<text x="250" y="155" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#fff">Execution</text>
|
|||
|
|
</svg>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Command Structure
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
command [options] [arguments] [redirections]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Examples:**
|
|||
|
|
```bash
|
|||
|
|
ls -l /home # List with details
|
|||
|
|
grep "error" log.txt # Search pattern
|
|||
|
|
find . -name "*.txt" # Find files
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Input/Output Redirection
|
|||
|
|
|
|||
|
|
**Controlling Data Flow**
|
|||
|
|
|
|||
|
|
```{mermaid}
|
|||
|
|
flowchart LR
|
|||
|
|
A[Input File<br/>data.txt] --> B{Command<br/>program}
|
|||
|
|
B --> C[Output File<br/>results.txt]
|
|||
|
|
|
|||
|
|
style A fill:#2e86ab,color:#fff
|
|||
|
|
style B fill:#a23b72,color:#fff
|
|||
|
|
style C fill:#f18f01,color:#fff
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Pipes - Command Chaining
|
|||
|
|
|
|||
|
|
**Connect processes together**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cat file.txt | grep "error" | sort | uniq
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```{mermaid}
|
|||
|
|
flowchart LR
|
|||
|
|
A[cat<br/>Reads file] -->|stdout| B[grep<br/>Filters text]
|
|||
|
|
B -->|stdout| C[sort<br/>Orders data]
|
|||
|
|
C -->|stdout| D[uniq<br/>Removes duplicates]
|
|||
|
|
|
|||
|
|
style A fill:#2e86ab,color:#fff
|
|||
|
|
style B fill:#a23b72,color:#fff
|
|||
|
|
style C fill:#f18f01,color:#fff
|
|||
|
|
style D fill:#3c8d5f,color:#fff
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Essential Commands
|
|||
|
|
|
|||
|
|
| Category | Commands | Purpose |
|
|||
|
|
|----------|----------|---------|
|
|||
|
|
| **Files** | `ls, cp, mv, rm, mkdir` | Manage files and directories |
|
|||
|
|
| **Navigation** | `cd, pwd` | Move around file system |
|
|||
|
|
| **Text** | `cat, grep, head, tail, wc` | View and search text |
|
|||
|
|
| **Process** | `ps, kill, &, bg, fg` | Manage running programs |
|
|||
|
|
| **Help** | `man, --help` | Get command information |
|
|||
|
|
|
|||
|
|
## Getting Started
|
|||
|
|
|
|||
|
|
**Next Steps:**
|
|||
|
|
- Practice basic file operations
|
|||
|
|
- Learn command combinations with pipes
|
|||
|
|
- Study pattern matching with wildcards
|
|||
|
|
- Explore shell scripting for automation
|
|||
|
|
- Use `man` pages for detailed help
|
|||
|
|
|
|||
|
|
**Remember:** Unix mastery comes through practice!
|