kae3g 9550: The Command Line - Your Primary Interface
Phase 1: Foundations & Philosophy | Week 3 | Reading Time: 14 minutes
What You'll Learn
- Why the command line is more powerful than GUIs
- Essential shell commands you'll use daily
- How to navigate the filesystem efficiently
- Shell shortcuts that save hours
- Understanding paths (absolute vs relative)
- How to compose commands for leverage
- Customizing your shell environment
Prerequisites
- 9510: Unix Philosophy - Text streams, composition
- 9540: Types and Sets - Understanding structure
Why Command Line?
GUIs are nice. Point, click, done. So why learn the command line?
1. Power
GUI: Can do what designer anticipated.
Command line: Can do anything the system allows.
Example:
- GUI: "Delete these 5 files" (click each, confirm each)
- Command line:
rm *.tmp
(delete all .tmp files, one command)
2. Automation
GUI: Must click repeatedly (boring, error-prone).
Command line: Write script once, run forever.
#!/bin/bash
# Backup script
tar -czf backup-$(date +%Y%m%d).tar.gz ~/important-stuff/
scp backup-*.tar.gz server:/backups/
Save this script, run daily (or automate with cron). GUIs can't do this.
3. Remote Access
GUI: Requires graphical session (slow over network).
Command line: Works over SSH (text-only, fast).
# From your laptop, control a server in Virginia:
ssh user@server.example.com
# Now you're on that server's command line
# Full control, minimal bandwidth
Servers typically don't have GUIs (waste of resources). Command line is the interface.
4. Composition
GUI: Each app is isolated (can't pipe Photoshop output to Excel).
Command line: Everything composes (Unix philosophy!).
# Get top 10 most common words
cat essay.md | tr ' ' '\n' | sort | uniq -c | sort -rn | head -10
Six programs, working together. Try that in a GUI!
Essential Commands
Navigation
# Where am I?
pwd # Print Working Directory
# => /Users/you/projects/valley
# List files
ls
ls -la # Long format, include hidden files
ls -lh # Human-readable sizes (5M instead of 5242880)
# Change directory
cd /path/to/directory # Absolute path
cd relative/path # Relative to current
cd .. # Parent directory
cd ~ # Home directory
cd - # Previous directory (toggle!)
File Operations
# Create
touch file.txt # Create empty file
mkdir directory # Create directory
mkdir -p a/b/c # Create nested directories
# Copy
cp source.txt dest.txt
cp -r dir1/ dir2/ # Recursive (for directories)
# Move/Rename
mv old.txt new.txt
mv file.txt ../ # Move to parent directory
# Delete
rm file.txt
rm -r directory/ # Recursive (careful!)
rm -i *.txt # Interactive (confirm each)
# View
cat file.txt # Dump entire file
less file.txt # Page through (q to quit)
head -20 file.txt # First 20 lines
tail -20 file.txt # Last 20 lines
Text Processing
# Search
grep "pattern" file.txt
grep -i "pattern" file.txt # Case-insensitive
grep -r "pattern" directory/ # Recursive
# Count
wc file.txt # Lines, words, characters
wc -l file.txt # Just lines
# Sort
sort file.txt
sort -n file.txt # Numeric sort
sort -r file.txt # Reverse
# Unique
sort file.txt | uniq # Remove adjacent duplicates
sort file.txt | uniq -c # Count occurrences
Paths: Absolute vs Relative
Absolute Paths
Start with /
(root):
/Users/alice/documents/essay.txt
/etc/hosts
/var/log/system.log
Always works, regardless of current directory.
Use when: Scripting (scripts should work from anywhere).
Relative Paths
Relative to current directory:
# If you're in /Users/alice/
documents/essay.txt # => /Users/alice/documents/essay.txt
../bob/file.txt # => /Users/bob/file.txt
./script.sh # => /Users/alice/script.sh (current dir)
Shorter, but depends on where you are.
Use when: Interactive use (less typing).
Special Paths
~ # Home directory (/Users/alice)
. # Current directory
.. # Parent directory
- # Previous directory (cd - to toggle)
Shell Shortcuts (Life-Changing!)
Tab Completion
cd /usr/lo[TAB] # Completes to: cd /usr/local/
Tab completes filenames, commands, paths. Use it constantly (save 80% of typing).
History Navigation
# Up arrow: previous command
# Down arrow: next command
# Search history:
Ctrl-R # Reverse search
# Type "grep" → shows last grep command
# Enter to run, Ctrl-R again for older matches
# View history
history
history | grep "git commit" # Find that commit command you ran yesterday
Editing Shortcuts
Ctrl-A # Beginning of line
Ctrl-E # End of line
Ctrl-U # Delete from cursor to beginning
Ctrl-K # Delete from cursor to end
Ctrl-W # Delete previous word
Ctrl-L # Clear screen (like `clear` command)
Master these: Save thousands of keystrokes.
Process Control
Ctrl-C # Kill current process (interrupt)
Ctrl-Z # Suspend current process
fg # Resume suspended process (foreground)
bg # Resume in background
# Run in background from start:
long-running-command &
Pipes and Redirection
Standard Streams
Every process has three streams:
stdin (0): Input (keyboard by default)
stdout (1): Output (terminal by default)
stderr (2): Errors (terminal by default)
Redirection
# Redirect stdout to file
ls > file-list.txt
# Append to file
echo "new line" >> log.txt
# Redirect stderr
command 2> errors.txt
# Redirect both stdout and stderr
command > output.txt 2>&1
# Redirect stdin (read from file)
sort < unsorted.txt
Pipes
# Pipe stdout of command1 to stdin of command2
command1 | command2
# Chain multiple:
cat file.txt | grep "error" | wc -l
# "How many error lines?"
Pipes are composition (Unix philosophy in action).
Practical Examples
Example 1: Find Large Files
# Find files larger than 100MB
find ~ -type f -size +100M
# Sort by size (largest first)
find ~ -type f -size +100M -exec ls -lh {} \; | sort -k5 -hr
Example 2: Monitor Disk Usage
# What's using space?
du -sh * # Summary, human-readable, current directory
# Largest directories:
du -sh * | sort -hr | head -10
Example 3: Quick Web Server
# Python 3: serve current directory on port 8000
python3 -m http.server 8000
# Visit: http://localhost:8000
# Instant file sharing!
Example 4: Download & Extract
# Download file
curl -O https://example.com/file.tar.gz
# Extract
tar -xzf file.tar.gz
# One-liner:
curl https://example.com/file.tar.gz | tar -xz
Shell Scripting Basics
Your First Script
#!/bin/bash
# hello.sh
echo "Hello, $1!" # $1 = first argument
Make executable:
chmod +x hello.sh
./hello.sh Alice # => "Hello, Alice!"
Variables
name="Alice"
echo "Hello, $name"
# Command substitution
current_date=$(date +%Y-%m-%d)
echo "Today is $current_date"
Conditionals
if [ -f "file.txt" ]; then
echo "File exists"
else
echo "File not found"
fi
Loops
# Loop over files
for file in *.txt; do
echo "Processing $file"
wc -l "$file"
done
# Loop over numbers
for i in {1..10}; do
echo "Iteration $i"
done
Customizing Your Shell
Shell Configuration
Files that run on startup:
~/.bashrc # Bash (Linux)
~/.zshrc # Zsh (macOS default since Catalina)
~/.profile # Login shells
Add aliases (shortcuts):
# In ~/.zshrc or ~/.bashrc:
alias ll='ls -lah'
alias gst='git status'
alias gco='git checkout'
alias reload='source ~/.zshrc'
# Now: type `ll` instead of `ls -lah`
Prompt Customization
# Show current directory and git branch
export PS1='\w $(git branch 2>/dev/null | grep "^*" | cut -d " " -f2)\$ '
# Looks like:
# ~/projects/valley main$
Environment Variables
# Set PATH (where shell looks for commands)
export PATH="$HOME/bin:$PATH"
# Now commands in ~/bin/ are available
Try This
Exercise 1: Navigation Workout
Without using GUI (Finder, Explorer):
- Open terminal
- Go to home directory:
cd ~
- List files:
ls -la
- Create test directory:
mkdir shell-practice
- Enter it:
cd shell-practice
- Create files:
touch file1.txt file2.txt file3.txt
- List them:
ls
- Go to parent:
cd ..
- Remove directory:
rm -r shell-practice
Goal: Feel comfortable navigating via command line.
Exercise 2: Pipeline Challenge
Find the 5 largest files in your home directory:
find ~ -type f -exec ls -lh {} \; 2>/dev/null | \
sort -k5 -hr | \
head -5
Breakdown:
find ~ -type f
: Find all files under home-exec ls -lh {}
: Runls -lh
on each (human-readable sizes)2>/dev/null
: Ignore errors (permission denied)sort -k5 -hr
: Sort by column 5 (size), human-readable, reversehead -5
: Take top 5
Modify: Find .txt files only, or find smallest files.
Exercise 3: Create Your Alias
Add to ~/.zshrc
or ~/.bashrc
:
# Your custom aliases
alias projects='cd ~/projects'
alias today='date +%Y-%m-%d'
alias count='wc -l'
# Reload:
source ~/.zshrc
Now:
projects
takes you to ~/projectstoday
prints current datecat file.txt | count
counts lines
Build your personal toolkit!
Advanced Patterns
1. Find and Replace Across Files
# Find all .md files containing "old text", replace with "new text"
find . -name "*.md" -exec sed -i '' 's/old text/new text/g' {} \;
# macOS: sed -i ''
# Linux: sed -i
2. Parallel Execution
# Process files in parallel (GNU parallel)
find . -name "*.jpg" | parallel convert {} {.}.png
# Or with xargs:
find . -name "*.jpg" | xargs -P 4 -I {} convert {} {}.png
# -P 4: use 4 parallel processes
3. Watch Command
# Run command every 2 seconds
watch -n 2 'df -h'
# Monitor disk space live
4. Process Substitution
# Compare output of two commands
diff <(ls dir1/) <(ls dir2/)
# <(...) creates temporary file with command output
The Shell as Programming Language
Shell (bash, zsh, fish) is a programming language:
Functions
# Define function
greet() {
echo "Hello, $1!"
}
# Call it
greet Alice # => "Hello, Alice!"
Error Handling
# Check if command succeeded
if git pull; then
echo "Updated successfully"
else
echo "Pull failed"
exit 1
fi
# Or shorthand:
git pull && echo "Success" || echo "Failed"
Arrays
# Bash arrays
files=(file1.txt file2.txt file3.txt)
# Loop over array
for file in "${files[@]}"; do
echo "Processing $file"
done
Going Deeper
Related Essays
- 9510: Unix Philosophy - Foundation for command-line thinking
- 9560: Text Files - What you're manipulating
- 9570: Processes - What shell commands create
- 9580: Filesystem - The structure you navigate
External Resources
- "The Linux Command Line" by William Shotts - Free PDF, comprehensive
- "Data Science at the Command Line" - Advanced shell techniques
- explainshell.com - Paste any command, get explanation
- tldr pages - Simplified man pages with examples
For Shell Mastery
- Fish shell - User-friendly alternative to bash/zsh
- Oh My Zsh - Framework for managing zsh configuration
- Powerlevel10k - Beautiful, informative prompt
Reflection Questions
- Why do developers love the command line despite its learning curve? (Power, automation, composition)
- Will GUIs make command lines obsolete? (Unlikely—they serve different needs)
- Is shell scripting "real programming"? (Yes! Bash is Turing-complete)
- Should non-technical users learn the command line? (Depends—but basic navigation is empowering)
- What's your most-used command? (Mine:
git status
,ls
,cd
)
Summary
The command line:
- Text-based interface to your computer
- More powerful than GUIs (can do anything system allows)
- Automatable (scripts beat repetitive clicking)
- Remote-friendly (SSH, low bandwidth)
- Composable (pipes, redirection, text streams)
Essential commands:
- Navigation: pwd, ls, cd
- Files: cp, mv, rm, touch, mkdir
- Text: cat, grep, sed, awk, wc
- Pipes: | for composition
Skills:
- Tab completion (save typing)
- History search (Ctrl-R)
- Keyboard shortcuts (Ctrl-A, Ctrl-E, etc.)
- Pipes and redirection (>, <, |)
In the Valley:
- Command line is primary (GUIs are optional)
- Scripting is essential (automation, reproducibility)
- Text orientation (everything flows through text)
- Unix tools are our foundation (grep, awk, sed mastery)
Next: We'll explore text files—the universal data format that makes the command line so powerful. Why plain text beats binary formats for durability and interoperability!
Navigation:
← Previous: 9540 (types sets mathematical foundations) | Phase 1 Index | Next: 9560 (text files universal format)
Metadata:
- Phase: 1 (Foundations)
- Week: 3
- Prerequisites: 9510, 9540
- Concepts: Shell, bash/zsh, navigation, pipes, redirection, automation, SSH
- Next Concepts: Text files, formats, serialization, plain text philosophy
Copyright © 2025 kae3g | Dual-licensed under Apache-2.0 / MIT
Competitive technology in service of clarity and beauty