What Is the Command Line and Why Do Developers Love It?
Foundations Beginner 10 min read

What Is the Command Line and Why Do Developers Love It?

That black screen with text isn't movie hacking — it's the most powerful tool on your computer. Here's why developers swear by it.

By J. Martin · · linux
Table of Contents

Why Should You Care?

Every developer you admire uses a black screen with text on it. That’s not movie hacking — it’s the command line.

The command line is just a way to talk to your computer using text instead of clicks. Instead of double-clicking a folder to open it, you type cd Documents. Instead of dragging a file to the trash, you type rm old-file.txt. Same operations, different interface.

So why would anyone choose text over a nice graphical interface with icons and buttons? Because text is composable. You can combine small commands into pipelines that do things no GUI was ever designed to do. You can automate repetitive tasks in seconds. You can control remote servers on the other side of the world as easily as the machine in front of you.

I run my entire AI lab, deploy websites, and manage 5 machines from this same terminal. It’s not nostalgia — it’s leverage.

By the end of this post, you’ll understand what the command line actually is, know a dozen essential commands, and see why pipes are one of the most powerful ideas in computing.

Terminal, Shell, CLI — What’s the Difference?

Before we go further, let’s untangle three words people use interchangeably.

Terminal — The window. It’s the application that displays text and accepts your keyboard input. On Linux it might be called GNOME Terminal or Konsole. On macOS it’s Terminal.app. On Windows it’s Windows Terminal or PowerShell. The terminal is just the screen.

Shell — The interpreter. It’s the program running inside the terminal that actually understands your commands. The most common shell on Linux and macOS is bash (Bourne Again Shell). There’s also zsh, fish, and others. The shell takes what you type, figures out what you mean, and tells the operating system what to do.

CLI — Command Line Interface. This is the general concept: any program you interact with by typing text commands rather than clicking buttons. git, npm, docker — these are all CLIs. They don’t have windows or menus. You talk to them with text.

So when you open a terminal, a shell starts inside it, and you use it to run CLI programs. Terminal is the window, shell is the brain, CLI is the style of interaction.

For this post, I’ll use “terminal” and “command line” interchangeably — that’s how most people talk about it in practice.

Your First Five Commands

Open a terminal. On Linux, it’s usually in your applications menu or you can press Ctrl+Alt+T. On macOS, search for “Terminal” in Spotlight. On Windows, search for “PowerShell” (though some commands differ — I recommend installing WSL for a full Linux terminal experience).

You’ll see a blinking cursor next to a prompt that looks something like this:

user@workstation:~$

That’s your shell saying “I’m ready. What do you want to do?” Let’s find out where we are and what’s around us.

pwd — Where Am I?

pwd

pwd stands for print working directory. It tells you your current location in the filesystem. You’ll see something like:

/home/user

That’s your home directory — the starting point every time you open a terminal. Think of it as your desktop, but for the command line.

ls — What’s Here?

ls

ls lists the files and folders in your current directory. You’ll see names like Documents, Downloads, Desktop — the same folders you see in your file manager.

Want more detail? Add a flag:

ls -l

Now you get permissions, file sizes, and dates. Flags modify how a command behaves. Most commands have dozens of them — you don’t need to memorize them all. You learn the ones you use.

Try this yourself: Run ls -la (that’s a lowercase L and a lowercase A). The -a flag shows hidden files — files whose names start with a dot. You’ll see things like .bashrc and .config that your file manager hides by default. These hidden files are where most of your system’s configuration lives.

cd — Move Around

cd Documents

cd stands for change directory. It moves you to a different folder. After running this, your prompt changes to show your new location, and ls will show different files.

A few patterns you’ll use constantly:

cd ..          # Go up one level (parent directory)
cd ~           # Go back to your home directory
cd /           # Go to the root of the filesystem
cd -           # Go back to wherever you just were

That last one — cd - — is like an “undo” for navigation. Surprisingly useful.

Try this yourself: Navigate around your system. cd Documents, then ls, then cd .. to go back. Try cd / and then ls to see the root of your filesystem — directories like bin, etc, home, usr. Every file on your computer lives somewhere under /.

mkdir — Create a Folder

mkdir my-project

mkdir makes a new directory. Simple, direct, no dialog box asking you to confirm. You type it, it happens.

cat — Read a File

cat notes.txt

cat prints the contents of a file to your screen. The name comes from “concatenate” — it can join multiple files together — but most people use it to quickly peek inside a file.

Try this yourself: Create a small playground to experiment in:

mkdir ~/cli-playground
cd ~/cli-playground
echo "Hello from the command line" > hello.txt
cat hello.txt

That echo command with > wrote text into a file. We’ll come back to redirection later — for now, just notice that you created a file and read it back without ever opening a text editor.

File Operations: cp, mv, rm

These three commands handle what you’d normally do with drag-and-drop.

cp — Copy

cp hello.txt hello-backup.txt

Copies a file. The first argument is the source, the second is the destination. For copying entire folders, add the -r flag (recursive):

cp -r my-project my-project-backup

mv — Move (and Rename)

mv hello.txt greeting.txt

mv moves a file. If the destination is in the same directory, it’s effectively a rename. If the destination is a different directory, it’s a move:

mv greeting.txt ~/Documents/

rm — Remove

rm hello-backup.txt

Deletes a file. There is no trash can. When you rm something, it’s gone. This is one of the few places the command line demands more respect than a GUI. For directories, you need the -r flag:

rm -r my-project-backup

Try this yourself: In your cli-playground, practice the cycle:

echo "test content" > sample.txt
cp sample.txt sample-copy.txt
ls
mv sample-copy.txt renamed.txt
ls
rm renamed.txt
ls

Watch how the file list changes after each command. You’re doing the same things you’d do in a file manager, but faster and without switching windows.

grep — The Search Engine for Text

This is where the command line starts to pull ahead of any GUI.

grep "error" logfile.txt

grep searches for a pattern inside a file and prints every line that matches. The name comes from an old editor command (g/re/p — globally search for a regular expression and print), but you don’t need to know that to use it.

A few powerful variations:

grep -i "error" logfile.txt       # Case-insensitive search
grep -r "TODO" ~/projects/        # Search recursively through all files in a directory
grep -n "function" script.js      # Show line numbers
grep -c "error" logfile.txt       # Count matching lines

That second one — grep -r "TODO" ~/projects/ — searches every file in every subdirectory under ~/projects/ for the word “TODO”. Try doing that with Finder or File Explorer. You can, but it takes more clicks and runs slower. From the terminal, it’s one command.

Try this yourself: Let’s create some files to search through:

cd ~/cli-playground
echo "This line has an error" > log1.txt
echo "This line is fine" >> log1.txt
echo "Another error occurred" >> log1.txt
echo "All good here" >> log1.txt
grep "error" log1.txt

You’ll see only the lines containing “error.” Now try grep -c "error" log1.txt to count them.

Pipes: Where It Gets Powerful

Here’s the idea that makes the command line more than just a text-based file manager.

In Unix (the family of operating systems that includes Linux and macOS), there’s a philosophy: build small tools that do one thing well, and connect them together. The connector is the pipe, written as |.

A pipe takes the output of one command and feeds it as input to the next command. Like snapping LEGO bricks together.

Start simple:

ls

That lists all the files in the current directory. Now let’s filter:

ls | grep ".txt"

ls produces a list of files. The pipe sends that list to grep, which filters it down to only lines containing “.txt”. Two tools, connected, doing something neither could do alone.

Now let’s count:

ls | grep ".txt" | wc -l

wc -l counts lines. So this pipeline says: list all files, filter to just .txt files, count how many there are. Three small tools, snapped together, answering a specific question.

That’s three commands you already know, combined into something new. No one had to build a “count text files” feature. You composed it yourself.

Try this yourself: Create a bunch of files and then query them:

cd ~/cli-playground
touch report.txt notes.txt data.csv image.png readme.md config.json
ls                           # See everything
ls | grep ".txt"             # Just text files
ls | grep ".txt" | wc -l    # How many text files?
ls | grep -v ".txt"          # Everything EXCEPT text files

The -v flag inverts the match — grep -v shows lines that DON’T match the pattern. Inversion is one of those small tools that becomes incredibly useful in pipelines.

Building Real Pipelines

Those examples were simple on purpose. Let me show you what this looks like when you’re solving a real problem.

Say I want to find the 10 largest files in a directory:

ls -lS | head -10

ls -lS lists files sorted by size (largest first). head -10 takes only the first 10 lines. Two commands, one answer.

Or say I have a log file and I want to see how many unique IP addresses accessed my server:

cat access.log | cut -d ' ' -f 1 | sort | uniq | wc -l

Let’s read that left to right:

  1. cat access.log — read the log file
  2. cut -d ' ' -f 1 — extract the first column (IP address) from each line
  3. sort — sort them alphabetically (required for uniq to work)
  4. uniq — remove consecutive duplicates
  5. wc -l — count the remaining lines

Five tools. One pipeline. An answer in under a second that would take minutes of clicking through a spreadsheet.

This is the Unix philosophy in action. Each tool is simple: cut just extracts columns, sort just sorts, uniq just removes duplicates. But connected together, they become an analytical engine.

Try this yourself: Let’s simulate a mini log file and analyze it:

cd ~/cli-playground
printf "192.168.1.1 GET /index.html\n192.168.1.2 GET /about.html\n192.168.1.1 GET /contact.html\n192.168.1.3 GET /index.html\n192.168.1.2 GET /index.html\n" > access.log
cat access.log
cat access.log | cut -d ' ' -f 1
cat access.log | cut -d ' ' -f 1 | sort | uniq
cat access.log | cut -d ' ' -f 1 | sort | uniq | wc -l

Run each pipeline stage separately and watch how the data transforms at each step. That incremental approach — add one pipe at a time, check the output — is exactly how experienced developers build pipelines.

The GUI Runs on the CLI

Here’s something most people don’t realize: the graphical interface on your computer is built on top of command-line tools. When you click “copy” in your file manager, it’s calling cp behind the scenes. When you search for a file, it’s running something like find or locate. When you install an app, a package manager CLI is doing the actual work.

The GUI is a layer of paint on top of the command line. It’s convenient, but it can only expose features that someone designed a button for. The command line exposes everything.

This is why the terminal isn’t “old” or “outdated” — it’s foundational. GUIs come and go, redesigns happen every few years, buttons move around. The command line has been the same for decades because it doesn’t need to change. ls worked in 1971. It works today. It’ll work in 2040.

Why Developers Choose Text Over Buttons

At this point you might be thinking: “Okay, but I can do all of this with clicks. Why would I bother memorizing commands?”

Fair question. Here’s the honest answer.

Speed. Once you know the commands, text is faster than clicking through menus. mv *.jpg photos/ moves every JPEG in one shot. Try selecting 200 files in a file manager.

Automation. You can save commands in a script file and run them whenever you want. I have scripts that back up my work, deploy websites, check system health, and pull files from my phone — all triggered by a single command. You can’t record a series of button clicks nearly as easily.

Remote access. When you SSH into a remote server — and you will, eventually — there’s no desktop. No file manager. No buttons. There’s a terminal. That’s it. Every server on the internet is managed this way. If you know the command line, you can manage any machine on the planet from your couch.

Composability. This is the real reason. GUIs are closed systems — you can only do what the designer anticipated. The command line is an open system. You combine small tools in ways their creators never imagined. That cut | sort | uniq pipeline? Nobody designed a “count unique IPs” button. You built it yourself from parts.

Precision. Commands do exactly what you tell them. No ambiguity, no “are you sure?” dialogs (usually). You say chmod 755 script.sh, and the permissions are set. You say find . -name "*.log" -mtime +30 -delete, and every log file older than 30 days is gone. That kind of surgical precision is hard to achieve with a mouse.

A Quick Reference

Here’s everything we covered, plus a few bonus commands, on one page:

CommandWhat It DoesExample
pwdPrint current directorypwd
lsList filesls -la
cdChange directorycd ~/projects
mkdirCreate directorymkdir new-folder
catPrint file contentscat readme.md
cpCopy file or directorycp -r src/ backup/
mvMove or renamemv old.txt new.txt
rmDelete (no undo!)rm -r temp/
grepSearch text for patternsgrep -r "TODO" .
headShow first N lineshead -20 log.txt
tailShow last N linestail -f log.txt
wcCount lines/words/charswc -l data.csv
sortSort linessort names.txt
uniqRemove duplicatessort data | uniq
cutExtract columnscut -d ',' -f 2 data.csv
findFind files by name/type/datefind . -name "*.js"
echoPrint textecho "hello"
manRead the manual for a commandman grep

That last one — man — is your built-in documentation. Every command has a manual page. When you forget a flag, man grep is faster than Googling.

What to Do Next

You now have the vocabulary. Here’s how to build fluency.

Step 1: Use the terminal for things you’d normally click. Navigate to a folder? cd. Create a file? touch. Delete something? rm. It’ll feel slower at first. That’s normal. After a week, it starts feeling faster.

Step 2: Learn one new command a day. Not from a list — from need. The next time you think “I wish I could find all the PNG files in this folder,” search for the answer. You’ll discover find . -name "*.png". That command will stick because you needed it.

Step 3: Start piping. Whenever you get output you want to filter, sort, or count — pipe it. history | grep "git" shows every git command you’ve ever run. ps aux | grep node shows if Node.js is running. Pipes turn individual commands into a toolkit.

Step 4: Read Your First Bash Script That Actually Does Something. Once you’re comfortable with commands, the next step is writing scripts — files full of commands that run as a unit. That’s where the real automation begins.

The command line isn’t something you learn all at once. It’s something you grow into. Every developer I know — myself included — started by typing ls and wondering what would happen. The fact that you’re reading this means you’re already further along than most.

Open a terminal. Type ls. See what’s there.