LField Notes ← AutonomyN° 02 · Linux Primer
A Practical Guide

Linux for Beginners

Concepts, essential commands, and the working knowledge you need to feel at home in the terminal.

Sections5 Parts Reading time~45 min AudienceNewcomers Last revised2026
Part One

What Is Linux, Really?

Before the commands, the concepts. What you're actually working with when you sit down at a Linux terminal.

Linux is a free and open-source operating system — the software layer that sits between the hardware (CPU, memory, disk, network) and the programs you run. Every Android phone, most servers on the internet, every supercomputer on Earth, and most of the embedded systems you've never thought about all run on Linux. It is by far the most widely deployed operating system in existence.

What people casually call "Linux" is technically just the kernel — the core program that talks to the hardware. A complete usable system also needs a shell, system utilities, a package manager, and (optionally) a graphical desktop. When all those pieces are bundled together, the result is called a Linux distribution (or "distro"). Ubuntu, Debian, Fedora, Arch, and the L4T system on a Jetson are all distributions.

1.1 Why Linux is everywhere

  • It is free — no licenses, no activation keys.
  • It is open source — anyone can read, modify, and redistribute the code.
  • It is modular — you can strip it down to a 5 MB embedded system or scale it up to a multi-thousand-core supercomputer.
  • It is powerful from the command line — once you learn the shell, you can automate almost anything.
  • It is stable and secure — designed from the ground up for multi-user, networked, always-on use.

1.2 How Linux differs from Windows / macOS

If you come from Windows, the biggest mental shift is that the command line is not optional — it is the primary interface for serious work. The graphical desktop is just one application running on top of the system. Most administrative tasks (installing software, configuring services, mounting drives) are still faster, clearer, and more reliable in the terminal than through any GUI.

Other key differences:

Path separators
Forward slashes /, never backslashes. /home/user/file, not C:\Users\user\file.
No drive letters
Everything lives under a single tree starting at / (the root). External drives and partitions are mounted into directories like /mnt/usb.
Extensions don't matter
A program is executable because of its permission bits, not because it ends in .exe. A text file can be called anything.
Case sensitivity
File.txt and file.txt are two different files. Watch your capitalization.
Software sources
From package repositories, not random websites. apt install firefox instead of downloading a .exe.
Part Two

Core Concepts You Must Understand

Eleven ideas that, once internalized, make every Linux command feel like it belongs to the same coherent system.

2.1 The filesystem hierarchy

Linux organizes everything into a single tree starting at / ("root"). Every file, every device, every drive lives somewhere under this tree. Here are the directories you will encounter most often:

Filesystem reference14 entries
/The root of the filesystem. Everything starts here.
/home/<user>Personal files for each user. Yours might be /home/majid — abbreviated as ~.
/rootThe home directory of the root (admin) user. Not the same as /.
/etcSystem-wide configuration files. Things like /etc/fstab, /etc/docker/daemon.json.
/varVariable data: logs (/var/log), package caches, mail spools, databases.
/usrUser-installed programs and libraries. /usr/bin holds most commands.
/bin, /sbinEssential system commands. /sbin holds admin-only commands.
/tmpTemporary files. Wiped on reboot.
/devDevice files. /dev/nvme0n1 is an SSD, /dev/sda1 a partition, etc.
/proc, /sysVirtual filesystems exposing kernel state. Not real files on disk.
/mnt, /mediaMount points for external drives and partitions you attach manually.
/bootKernel images and bootloader files.
/libShared libraries needed by programs in /bin and /sbin.
/optOptional / third-party software, often used by vendor packages.

The shorthand ~ always expands to your home directory. So cd ~/projects is the same as cd /home/majid/projects.

2.2 Everything is a file

This is one of Linux's foundational ideas. A regular document is a file — but so is a hard drive (/dev/nvme0n1), a USB port, a network connection, the random number generator, even running processes (/proc/1234). Programs read and write to all of them using the same operations they would use on a text file.

"Everything is a file" is why so many command-line tools compose so beautifully — they all speak the same language of byte streams.

2.3 Users, root, and sudo

Linux is multi-user from the ground up. Every file has an owner, and every running program runs as some user. There is one special user named root who can do absolutely anything — read any file, kill any process, modify the kernel.

Logging in as root for daily work is dangerous (one typo can wipe the system), so the convention on Ubuntu/Debian is:

  • Your normal account does most things — browse, edit your own files, run programs.
  • When you need root power for one command, you put sudo in front of it. Linux asks for your password, runs that one command as root, then drops back to normal.
  • Only users in the sudo group are allowed to do this. Your account is in that group by default on a fresh install.
terminalusing sudo
sudo apt install nano       # install software
sudo mkdir /mnt/nvme        # create directory in protected location
sudo systemctl start docker # start a system service

2.4 File permissions

Every file in Linux has three sets of permissions: what the owner can do, what the group can do, and what everyone else can do. Each set has three flags:

r — read
View the contents of a file. For directories, list the files inside.
w — write
Modify the file. For directories, add or remove files.
x — execute
Run as a program. For directories, enter (cd into) it.

When you run ls -l you see something like:

outputls -l
-rw-r--r-- 1 majid majid 4096 May  1 17:22 notes.txt

That breaks down as: file type (- for file, d for directory, l for symlink), owner permissions (rw-), group permissions (r--), everyone-else permissions (r--), then the owner and group names.

Permissions are also written as octal numbers (each rwx group becomes a digit 0-7):

  • 755 = rwxr-xr-x — typical for executables
  • 644 = rw-r--r-- — typical for regular files
  • 600 = rw------- — owner only (used for swapfiles, SSH keys, sensitive configs)

2.5 Processes

A process is a running instance of a program. Every process has a PID (process ID, a number), a parent process (every process is launched by another), a user it runs as, memory it has allocated, and file handles it has open.

You can list processes with ps or watch them live with top / htop. You stop a misbehaving process with kill <PID>.

2.6 The shell

The shell is the program that reads the commands you type and runs them. The default on Ubuntu is bash ("Bourne Again Shell"). Modern alternatives include zsh and fish.

Your prompt looks like this:

shellbash prompt
majid@majid-desktop:~$

Reading left to right: your username, the @ separator, the machine's hostname, the colon, your current directory (~ = home), and finally $ (which becomes # if you're root).

2.7 Streams, pipes, and redirection

Every program has three default streams:

  • stdin (standard input) — where it reads from
  • stdout (standard output) — where it writes results
  • stderr (standard error) — where it writes error messages

By default they're all your terminal. But you can redirect them:

Redirection & control operators8 forms
cmd > fileSend stdout of cmd to file (overwrites).
cmd >> fileAppend stdout to file.
cmd 2> fileSend stderr to file.
cmd &> fileSend both stdout and stderr to file.
cmd < fileRead stdin from file.
cmd1 | cmd2Pipe: send stdout of cmd1 as stdin to cmd2.
cmd1 && cmd2Run cmd2 only if cmd1 succeeded.
cmd1 || cmd2Run cmd2 only if cmd1 failed.

Real example:

terminalappend to a protected file
echo "/mnt/nvme/swapfile  none  swap  sw  0  0" | sudo tee -a /etc/fstab

This prints the line (echo), pipes it to tee, which (with sudo and the -a "append" flag) writes it to the end of /etc/fstab. The trick here: sudo echo ... > /etc/fstab wouldn't work, because the redirect is done by your shell, not by sudo.

2.8 Package management

On Ubuntu/Debian-based systems (including JetPack), software comes from packages stored in online repositories. The tool that manages them is apt.

apt & dpkg essentials7 commands
sudo apt updateRefresh the list of available packages.
sudo apt upgradeInstall newer versions of installed packages.
sudo apt install <pkg>Install a package and its dependencies.
sudo apt remove <pkg>Remove a package (keep config files).
sudo apt purge <pkg>Remove a package and its config files.
apt search <term>Search for packages by name or description.
dpkg -lList all installed packages.

2.9 Services and systemd

Long-running background programs (Docker, networking, SSH, web servers) are called services or daemons. They're managed by systemd via the systemctl command.

systemctl & journalctl8 commands
systemctl status <svc>Is the service running? Show its recent log.
sudo systemctl start <svc>Start the service now.
sudo systemctl stop <svc>Stop it now.
sudo systemctl restart <svc>Restart it.
sudo systemctl enable <svc>Start it automatically on boot.
sudo systemctl disable <svc>Don't start on boot.
journalctl -u <svc>Show this service's full log.
journalctl -u <svc> -fFollow the log live (like tail -f).

2.10 Mounting filesystems

In Linux, drives don't get drive letters — they get attached ("mounted") into a directory in the existing tree. Once mounted, accessing that directory means accessing the drive.

An NVMe drive setup typically looks like:

Block device
/dev/nvme0n1 — the whole disk
Partition
/dev/nvme0n1p1 — the formatted partition
Mount point
/mnt/nvme — the directory it's attached to

The file /etc/fstab lists what should be auto-mounted at boot. Each line has 6 fields: source, mountpoint, filesystem type, options, dump, fsck order.

2.11 Environment variables

Variables that programs (and the shell) can read. They're spelled in UPPERCASE by convention. View one with the $ prefix:

terminalreading environment variables
echo $HOME       # /home/majid
echo $USER       # majid
echo $PATH       # list of folders the shell searches for commands

Set one for the current shell:

terminalsetting a variable
export MY_VAR="hello"

Make it permanent by adding the line to ~/.bashrc (your shell's startup file).

Part Three

Essential Commands by Category

A working reference. Use Parts 1 and 2 to understand why; come back here for the what.

3.1 Navigation

Moving around the filesystem10 commands
pwdPrint working directory (where you are).
lsList files in current directory.
ls -lLong listing: permissions, owner, size, date.
ls -laLong listing including hidden files (those starting with .).
ls -lhSame as -l but human-readable sizes (KB, MB, GB).
cd <dir>Change directory.
cd ..Go up one level.
cdGo to your home directory (same as cd ~).
cd -Go to the previous directory you were in.
treeShow directory contents as a tree (may need apt install tree).

3.2 File and directory operations

Creating, copying, moving, deleting10 commands
touch <file>Create an empty file (or update its timestamp).
mkdir <dir>Create a directory.
mkdir -p a/b/cCreate nested directories, no error if they exist.
cp <src> <dst>Copy a file.
cp -r <src> <dst>Copy a directory recursively.
mv <src> <dst>Move (or rename) a file or directory.
rm <file>Delete a file (no recycle bin — gone forever).
rm -r <dir>Delete a directory and everything in it.
rm -rf <dir>Force-delete recursively. Dangerous — verify the path first.
ln -s <target> <link>Create a symbolic link (shortcut).
Critical warning about rm

There is no undo. Always double-check the path, especially with -rf. The infamous rm -rf / wipes the entire system. Modern rm has guards against that exact command, but you can still trivially destroy everything in your home directory by mistake.

3.3 Viewing file contents

Reading text files10 commands
cat <file>Print entire file to terminal. Best for short files.
less <file>Page through a file. Arrow keys to scroll, q to quit, / to search.
head <file>First 10 lines.
head -n 20 <file>First 20 lines.
tail <file>Last 10 lines.
tail -n 50 <file>Last 50 lines.
tail -f <file>Live-follow a file (great for log files).
wc -l <file>Count lines in the file.
wc <file>Count lines, words, characters.
file <file>Identify file type (text, binary, image, etc.).

3.4 Editing files in the terminal

Two editors are common on Linux: nano (simple, friendly) and vim / vi (powerful, steep learning curve). For beginners, stick with nano.

Terminal editors3 invocations
nano <file>Open file in nano. Ctrl+O to save, Ctrl+X to quit.
nano +50 <file>Open at line 50.
vim <file>Open in vim. Press i to type, Esc then :wq to save and quit.

3.5 Finding things

Searching for files and content10 commands
find <dir> -name '*.py'Find files matching a pattern under a directory.
find . -type dFind directories only (under current location).
find . -size +100MFind files larger than 100 MB.
grep 'text' <file>Find lines containing 'text' in a file.
grep -r 'text' <dir>Recursively search a whole directory.
grep -i 'text' <file>Case-insensitive search.
grep -n 'text' <file>Show line numbers.
which <cmd>Show where a command lives (e.g. which python3).
whereis <cmd>Show binary, source, and man page locations.
locate <name>Fast filename search using a pre-built index.

3.6 Permissions and ownership

chmod, chown, chgrp8 commands
chmod 755 <file>Set permissions to rwxr-xr-x (octal notation).
chmod +x <file>Make executable.
chmod -x <file>Remove executable bit.
chmod u+w,g-w <file>Add write for owner, remove for group.
chown user <file>Change owner of file.
chown user:group <file>Change owner AND group.
chown -R user <dir>Recursively change ownership of a directory.
chgrp group <file>Change group only.

3.7 System information and monitoring

Inspecting your machine15 commands
uname -aKernel version, architecture, hostname.
lsb_release -aLinux distribution info.
hostnameThe machine's name.
uptimeHow long the system has been running, plus load average.
whoamiPrint your username.
idYour UID, GID, and group memberships.
dateCurrent date and time.
calDisplay a calendar.
free -hMemory usage, human-readable.
df -hDisk space per mounted filesystem.
du -sh <dir>Total size of a directory.
lsblkList block devices (drives + partitions) as a tree.
lspciList PCI devices (GPU, network cards, etc.).
lsusbList USB devices.
dmesgKernel ring-buffer messages (boot, hardware events).

3.8 Process management

Viewing and controlling processes12 commands
psSnapshot of your processes in this terminal.
ps auxSnapshot of ALL running processes on the system.
ps aux | grep firefoxFilter the process list for 'firefox'.
topLive process viewer. Press q to quit.
htopBetter top (apt install htop).
kill <PID>Politely ask process to terminate.
kill -9 <PID>Force-kill (last resort).
killall <name>Kill all processes by name.
pgrep <name>Find PIDs by name.
jobsList background jobs in this shell.
bg, fgSend job to background / bring to foreground.
nohup cmd &Run command, detached, surviving terminal close.

3.9 Networking

Network diagnostics & transfer11 commands
ping <host>Test connectivity (ping google.com). Ctrl+C to stop.
ip aShow all network interfaces and addresses.
ip routeShow routing table.
nmcli device statusNetworkManager: list interfaces.
nmcli device wifi listList Wi-Fi networks.
nmcli device wifi connect <SSID> password <PWD>Connect to Wi-Fi.
ssh user@hostConnect to a remote machine via SSH.
scp <src> user@host:<dst>Copy files over SSH.
wget <url>Download a file from a URL.
curl <url>Fetch a URL (great for APIs).
ss -tulnListening ports (modern replacement for netstat).

3.10 Disks and filesystems

Storage and partitioning11 commands
lsblkBlock-device tree.
blkidUUIDs and filesystem types.
df -hMounted filesystems and free space.
du -sh <dir>Disk used by a directory.
mountShow all mounted filesystems.
sudo mount <dev> <dir>Mount a device at a directory.
sudo umount <dir>Unmount.
sudo mount -aMount everything in /etc/fstab.
sudo parted <dev>Interactive partition editor.
sudo fdisk -lList partitions on all disks.
sudo mkfs.ext4 <part>Format partition as ext4.

3.11 Archives and compression

tar, zip, gzip7 commands
tar -czvf x.tar.gz <dir>Create a gzipped tar archive.
tar -xzvf x.tar.gzExtract a gzipped tar archive.
tar -tvf x.tar.gzList contents without extracting.
zip -r x.zip <dir>Create a zip archive.
unzip x.zipExtract a zip archive.
gzip <file>Compress (replaces with file.gz).
gunzip <file.gz>Decompress.

3.12 Text processing

Filtering and transforming text8 commands
sort <file>Sort lines.
sort -n <file>Numeric sort.
uniq <file>Remove adjacent duplicate lines (run after sort).
cut -d',' -f2 <file>Cut field 2 from a comma-separated file.
awk '{print $1}' <file>Print first whitespace-separated field of each line.
sed 's/old/new/g' <file>Stream-edit: replace 'old' with 'new'.
tr 'a-z' 'A-Z'Translate: convert lowercase to uppercase.
xargsBuild commands from input lines.

3.13 Miscellaneous essentials

Daily-driver one-liners12 commands
man <cmd>Open the manual page. q to quit. The most useful command.
<cmd> --helpQuick help text for a command.
historyShow your command history.
!42Re-run command number 42 from history.
!!Re-run the previous command.
sudo !!Re-run the previous command with sudo.
clear (or Ctrl+L)Clear the terminal screen.
echo <text>Print text. Useful in scripts and pipelines.
alias ll='ls -la'Create a shortcut. Save in ~/.bashrc to make permanent.
exit (or Ctrl+D)Close the terminal session.
rebootRestart the system (needs sudo).
shutdown -h nowPower off the system (needs sudo).
Part Four

A Real Worked Example

The actual command sequence from setting up an NVIDIA Jetson dev board, in the order it was run. Reread it after a few weeks — most of these will become muscle memory.

4.1 Inspecting hardware and storage

lsblk shows a tree of every block device (drive) and its partitions. Useful for confirming a new drive is visible to the kernel.

terminallist block devices
lsblk

blkid prints the UUID, label, and filesystem type of a partition. UUIDs are stable identifiers that survive renaming, so you use the UUID rather than /dev/nvme0n1p1 in /etc/fstab.

terminalread partition metadata
sudo blkid /dev/nvme0n1p1

free, df, du — the three quick health checks for memory and disk usage.

terminalquick resource snapshot
free -h          # memory + swap usage
df -h /mnt/nvme  # show free space on the NVMe
sudo du -sh /var/lib/docker  # how big is this folder?

4.2 Partitioning and formatting

parted — partition table editor:

terminalcreate a fresh partition table
sudo parted /dev/nvme0n1 --script mklabel gpt
sudo parted /dev/nvme0n1 --script mkpart primary ext4 0% 100%

The first line wipes the disk and creates a fresh GPT partition table. The second creates one partition spanning the entire disk, hinting at ext4. The --script flag makes parted run non-interactively so it doesn't prompt.

mkfs.ext4 — create the filesystem:

terminalformat the partition
sudo mkfs.ext4 -L jetson-nvme /dev/nvme0n1p1

Formats the new partition as ext4 (Linux's standard journaling filesystem) with the label jetson-nvme. The label is a friendly name; the UUID is what fstab uses.

4.3 Mounting and /etc/fstab

terminalcreate mount point and mount once
sudo mkdir -p /mnt/nvme
sudo mount /dev/nvme0n1p1 /mnt/nvme

Persistent mount via fstab:

terminalauto-mount across reboots
echo "UUID=fa4e... /mnt/nvme ext4 defaults,noatime,nofail 0 2" | sudo tee -a /etc/fstab
sudo mount -a    # apply all fstab entries now

Anatomy of an fstab line

UUID=...
What to mount. UUID survives device renaming.
/mnt/nvme
Where to mount it.
ext4
Filesystem type.
defaults
Sane defaults (rw, exec, suid, etc.).
noatime
Don't update last-access timestamps. Faster, less SSD wear.
nofail
Don't block boot if drive is missing.
0
Dump flag (legacy, almost always 0).
2
fsck order at boot (0=skip, 1=root only, 2=other).

4.4 Taking ownership

terminalchown your mount
sudo chown -R $USER:$USER /mnt/nvme

Recursively changes the owner and group of /mnt/nvme to your user. The shell expands $USER to your username before running the command. The -R flag means "recursive" — apply to everything inside.

4.5 Creating a swapfile

terminalbuild and activate an 8 GB swapfile
sudo fallocate -l 8G /mnt/nvme/swapfile
sudo chmod 600 /mnt/nvme/swapfile
sudo mkswap /mnt/nvme/swapfile
sudo swapon /mnt/nvme/swapfile

Step by step:

  • fallocate -l 8G — instantly reserve 8 GB on disk (no zero-fill, fast).
  • chmod 600 — make it owner-only readable/writable. Mandatory — mkswap refuses otherwise.
  • mkswap — write swap-format header so the kernel recognizes it.
  • swapon — activate it now. Adding a fstab entry auto-activates at boot.

4.6 Copying with rsync

terminalrelocate a directory
sudo rsync -aP /var/lib/docker/ /mnt/nvme/docker/

rsync is a smart copy tool. -a means "archive mode" — preserve permissions, ownership, timestamps, and symlinks. -P combines progress display and resume support. The trailing slash on the source (/var/lib/docker/) means "copy the contents of this directory" rather than the directory itself.

4.7 Editing config files via heredoc

terminalatomic write of a config file
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{ ... json content ... }
EOF

This is a heredoc — everything between <<'EOF' and the closing EOF is fed to tee as input, which writes it to the file. The > /dev/null silences the echo back to terminal. Useful for atomic config writes without nano typos.

4.8 Adding yourself to a group

terminalgroup membership
sudo usermod -aG docker $USER
groups $USER          # verify
newgrp docker         # activate in current shell

-aG: a = append (don't replace existing groups), G = supplementary group. Without -a, you would replace ALL your other groups with just "docker" and lock yourself out of sudo.

Group changes only take effect after login, so newgrp docker gives the current shell the new permissions immediately. A logout/login makes it permanent everywhere.

4.9 Controlling services with systemctl

terminalstop, inspect, start a service
sudo systemctl status docker --no-pager
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd
sudo systemctl start docker

The --no-pager flag prevents systemctl from opening less — useful when piping output to head or capturing it in a script.

4.10 Installing software with apt

terminalinstall non-interactively
sudo apt install -y nano

The -y flag answers "yes" to the confirmation prompt. Use carefully — it commits to the install without showing you the package list first.

4.11 Docker quick-reference

Containers, images, runtime14 commands
docker --versionShow Docker version.
docker infoShow daemon configuration (data root, runtimes...).
docker run --rm hello-worldRun a test container; --rm auto-deletes when it exits.
docker run -it ubuntu bashRun interactive Ubuntu shell in a container.
docker psList running containers.
docker ps -aList all containers (including stopped ones).
docker imagesList downloaded images.
docker pull <image>Download an image without running it.
docker stop <id>Politely stop a running container.
docker rm <id>Remove a stopped container.
docker rmi <image>Remove an image.
docker logs <id>Show a container's logs.
docker exec -it <id> bashOpen a shell inside a running container.
docker system pruneFree up space (removes stopped containers, unused images...).
Part Five

Shortcuts, Tips, and Pitfalls

The small habits and ten-second tricks that separate someone who lives in the terminal from someone who's just visiting.

5.1 Keyboard shortcuts that change your life

Bash keystroke essentials12 shortcuts
TabAuto-complete file/command names. Press TWICE for suggestions.
Ctrl+CCancel the running command.
Ctrl+DEnd-of-input. Closes shells, exits programs.
Ctrl+LClear screen (same as clear).
Ctrl+RSearch command history backwards. Keep pressing for older.
Ctrl+A / Ctrl+EJump to start / end of line.
Ctrl+U / Ctrl+KDelete from cursor to start / end of line.
Ctrl+WDelete previous word.
Ctrl+ZSuspend current process (resume later with fg).
Up / Down arrowsCycle through previous commands.
Alt+. (or Esc + .)Insert last argument of previous command.
Ctrl+Shift+C / VCopy / paste in most terminal emulators.

5.2 Tab completion is your best friend

Almost every modern shell command supports Tab completion. Type the first few letters and press Tab — the shell will fill in file names, command names, package names, even Git branches. If there are multiple matches, Tab twice shows them all.

Use Tab completion constantly. It prevents typos and saves enormous amounts of typing.

5.3 Read the manual

Almost every command has a manual page accessible via man:

terminalbuilt-in documentation
man ls
man chmod
man fstab

Inside man, / searches, n / N jumps to next/previous match, q quits. For a brief built-in help, most commands also accept --help:

terminalquick help text
ls --help | less

5.4 Common pitfalls

  • Forgetting sudo. If a command says "permission denied" while modifying system files, you probably need sudo.
  • Putting sudo in front of a pipe / redirect. sudo echo x > /etc/fstab doesn't work because the redirect is performed by your shell, not by sudo. Use sudo tee instead.
  • Spaces in arguments. rm my file tries to delete two files. Quote it: rm "my file".
  • Hidden files. Files starting with . (like .bashrc) are hidden from ls by default. Use ls -a.
  • Case sensitivity. Documents and documents are different folders.
  • Deleting symbolic link contents. rm -rf link/ with the trailing slash can follow the link and delete its target. Drop the slash to delete just the link.
  • Editing files without backups. Before editing important configs, copy them: sudo cp /etc/fstab /etc/fstab.bak.
  • Forgetting && vs ;. With ; the second command runs even if the first failed. With && it only runs on success — much safer for sequences.
!

A useful test for destructive commands. Before running rm -rf foo*, replace rm with ls: ls foo*. If ls shows the files you intend to delete, the rm command is safe. If it shows surprises, you just dodged a disaster.

5.5 Ten habits to build

  1. Read what's on screen before pressing Enter. The shell does not protect you.
  2. Use Tab completion for every path. Less typing, fewer mistakes.
  3. Test rm with ls first. Replace rm with ls to verify the same glob matches the right files.
  4. Back up before editing system configs. A .bak copy costs nothing and saves hours.
  5. When in doubt, man <cmd> or add --help. Faster than Googling.
  6. Keep notes. A file like ~/notes/setup.md pays for itself a hundred times.
  7. Use history to recover "what did I just do?" Especially after a long debugging session.
  8. Prefer absolute paths in scripts. Relative paths break when cd gets involved.
  9. Read error messages slowly. They almost always tell you what's wrong.
  10. Never paste a command from the internet without understanding what each part does. Especially anything starting with sudo.

5.6 Going deeper

When you're ready for the next level, look into:

Bash scripting
Automate repetitive sequences. The "Bash Guide for Beginners" is a good start.
Vim or Neovim
Once you climb the learning curve, editing speed jumps dramatically.
tmux
Keep sessions alive across SSH disconnects, run multiple panes side by side.
SSH keys
Passwordless secure login between machines.
git
Version control. The universal tool of modern development.
cron / systemd timers
Schedule tasks to run automatically.
Regular expressions
Supercharge grep, sed, find, and almost every text tool.

Reading order suggestion

Skim Part I once. Read Part II carefully. Use Parts III and IV as references — come back when you need a specific command. Revisit Part V every couple of weeks until the habits stick.

The fastest way to learn Linux is to use it daily. Within a month you will be doing things you can't imagine right now.