Command Line Basics

After part one of the git for designers post, Kim Røen suggested in the comments doing a post with some instructions on using the command line. This is that post. We’re going to be focusing on the Mac side of things, but a lot of the concepts in here will apply to all command line programs as well.

What is the Command Line?

If you really want to learn about the history of the command line, you can check out the Wikipedia page on the topic:

A command-line interface (CLI) is a mechanism for interacting with a computer operating system or software by typing commands to perform specific tasks… This method of instructing a computer to perform a given task is referred to as “entering” a command: the system waits for the user to conclude the submitting of the text command by pressing the “Enter” key (a descendant of the “carriage return” key of a typewriter keyboard). A command-line interpreter then receives, parses, and executes the requested user command.

TL;DR: wall of text.

You don’t have to be a developer in order to get the full benefit using the command line. Being familiar with how the command line works can vastly simplify your daily life. Let’s say you’d like to move all of the files with a certain extension from one folder to another. Let’s also say that there are far too many to want to select them in Finder and move them to a folder called html_files. You could take a lot of time and do it in Finder or open a terminal and type in the following:

  mv *.html html_files

It’s pretty easy once you get the hang of it. We’ll walk through that example now, learning the commands we would need to build up to that.

What Does It Look Like?

If you’re on a Mac, launch Terminal. You can find it in the "Utilities" folder inside of your main "Applications" Folder. This is what you’ll see:

Terminal

Isn’t that exciting? Well no, not very. In fact, the command line is pretty boring and generally not very pretty. It does, however, provide great power once you learn to use it.

Let’s Learn Some Commands

The main way that you’ll interact with the command line is by typing commands in. For the most part, it works like this (yes, there are a lot of exceptions):

[command name] [options] [arguments]

We’ll start our command line journey with the ls command. This is a command that lists information about files. Essentially, it shows you a list of files in the directory or folder you tell it to. Let’s try it. Back in Terminal, type in ls and press enter. You should see something like the following:

  $ ls
  Public                  Desktop                 Library                 Sites               
  Documents               Movies                  Source                  Downloads           
  Music                   Dropbox                 Pictures

That’s what my home directory looks like. Cool, right!

Let’s say you wanted slightly different output that had file sizes and other information. Most command line programs offer more options to do what you want to do through the use of arguments. These can also be called options or flags. They are usually prefixed with a - character (hyphen or dash) to tell the program that you’re submitting an argument.

Here’s what the ls command looks like with the flags for a long list all files (by default, files that start with a . character are hidden) with human file sizes:

[~]$ ls -alhF
drwxr-xr-x+ 57 jason  staff   1.9K Feb  9 16:27 ./
drwxr-xr-x   5 root   admin   170B Nov  2 14:21 ../
-rw-r--r--@  1 jason  staff    15K Feb  8 09:51 .DS_Store
drwx------   2 jason  staff    68B Feb  8 09:40 .Trash/
lrwxr-xr-x   1 jason  staff    42B Nov  2 15:34 .bash@ -> /Users/jason/Source/private/dotfiles/.bash
-rw-------   1 jason  staff   112K Feb  7 16:25 .bash_history
lrwxr-xr-x   1 jason  staff    37B Nov  2 15:36 .bash_profile@ -> Source/private/dotfiles/.bash_profile
drwx------  13 jason  staff   442B Feb 13 10:00 .dropbox/
drwxr-xr-x   3 jason  staff   102B Nov  2 16:35 .gem/
lrwxr-xr-x   1 jason  staff    47B Nov  2 15:34 .gitconfig@ -> /Users/jason/Source/private/dotfiles/.gitconfig
-rw-r--r--   1 jason  staff    13B Nov  2 14:24 .gitignore_global
lrwxr-xr-x   1 jason  staff    20B Nov  2 15:48 .gvimrc@ -> Source/dotvim/gvimrc
drwx------   3 jason  staff   102B Dec  8 18:28 .heroku/
-rw-r--r--   1 jason  staff    27B Nov  2 14:24 .hgignore_global
-rw-r--r--@  1 jason  staff   622B Jan  9 14:10 .hgrc
drwxr-xr-x   6 jason  staff   204B Nov  7 09:36 .ievms/
lrwxr-xr-x   1 jason  staff    45B Nov  2 15:34 .inputrc@ -> /Users/jason/Source/private/dotfiles/.inputrc
-rw-r--r--   1 jason  staff   349B Feb  7 11:18 .irb-history
-rw-r--r--   1 jason  staff   525B Jan 30 11:42 .irb_history
-rw-------   1 jason  staff   649B Jan 23 10:18 .mysql_history
drwxr-xr-x  69 jason  staff   2.3K Jan 12 00:40 .npm/
lrwxr-xr-x   1 jason  staff    50B Nov  2 17:20 .pow@ -> /Users/jason/Library/Application Support/Pow/Hosts
drwxr-xr-x   4 jason  staff   136B Nov 21 17:06 .rbenv/
-rw-r--r--   1 jason  staff   8.1K Dec  7 18:02 .rdebug_hist
drwxr-xr-x  27 jason  staff   918B Nov 21 17:07 .rvm/
drwx------   9 jason  staff   306B Nov  7 11:57 .ssh/
lrwxr-xr-x   1 jason  staff    13B Nov  2 15:48 .vim@ -> Source/dotvim
-rw-------   1 jason  staff    45K Feb  8 15:32 .viminfo
lrwxr-xr-x   1 jason  staff    19B Nov  2 15:48 .vimrc@ -> Source/dotvim/vimrc
-rw-r--r--   1 jason  staff   661B Jan 11 11:37 .vimrc.local
drwxr-xr-x@  5 jason  staff   170B Feb  8 09:40 AeroFS/
drwx------+  4 jason  staff   136B Feb  7 16:26 Desktop/
drwx------+ 21 jason  staff   714B Feb  7 16:26 Documents/
drwx------+  6 jason  staff   204B Feb  8 10:09 Downloads/
drwx------@ 51 jason  staff   1.7K Feb 13 09:48 Dropbox/
drwx------@  8 jason  staff   272B Jan 19 13:51 Insync/
drwx------@ 49 jason  staff   1.6K Feb  7 15:23 Library/
drwx------+  5 jason  staff   170B Feb  2 16:19 Movies/
drwx------+  6 jason  staff   204B Feb  2 16:19 Music/
drwx------+  7 jason  staff   238B Feb  2 16:19 Pictures/
drwxr-xr-x+  5 jason  staff   170B Feb  2 16:19 Public/
drwxr-xr-x   5 jason  staff   170B Feb  2 16:19 Sites/
drwxr-xr-x   9 jason  staff   306B Nov 29 15:32 Source/
lrwxr-xr-x   1 jason  staff    40B Nov  2 15:34 bin@ -> /Users/jason/Source/private/dotfiles/bin

You can look up the arguments to ls here. The path when using the ls command is optional. If it’s not submitted, it defaults to the current directory. You can add another path after the arguments if you choose to get a file listing of a directory other than the current one.

Some More Commands

If you want to change the current working directory, you can do so with the cd command. If you’re in your home directory and want to change to. If you wanted to enter your Sites directory, you would type the following:

  $ cd Sites
  [~/Sites] $

That would put you in the Sites directory. The output you see above [~/Sites] $ is because I’ve modified the built in prompt. If you don’t have that in your prompt (you probably don’t) and forget where you are, you can always use the pwd command to remind you:

[~/Sites]$ pwd
/Users/jason/Sites

Accomplishing Something Useful

Let’s say I wanted to duplicate one file as another file without using the Finder. For that, you can use the cp command. It takes two arguments: the path of the file you want to copy from and the path of the file you want to copy to. Let’s say I was in the think_vitamin directory from the Git for Designers article and I wanted to copy the index.html file to homepage.html. I could do the following:

[~/Sites]$ cd think_vitamin/
[~/Sites/think_vitamin master]$ cp index.html homepage.html

That would duplicate the index.html file to homepage.html file. If I have a change of heart and decide to rename the homepage.html file, I can use the mv command:

[~/Sites/think_vitamin master]$ mv homepage.html home.html
[~/Sites/think_vitamin master]$ ls -alhF
total 16
drwxr-xr-x   5 jason  staff   170B Feb 14 12:50 ./
drwxr-xr-x+ 36 jason  staff   1.2K Feb 12 12:01 ../
drwxr-xr-x  10 jason  staff   340B Feb  1 01:57 .git/
-rw-r--r--   1 jason  staff     3B Feb 14 12:46 home.html
-rw-r--r--   1 jason  staff     3B Feb  1 01:57 index.html

Let’s say I was trying to organize files by their type. I’ve decided (for some reason) to move all html files to the html directory. I could move every file individually in Finder. Or, I could use something called the wildcard character and do it on the command line. The wildcard character is represented by an asterisk. Here’s what it looks like:

[~/Sites/think_vitamin master]$ mv *.html html/
[~/Sites/think_vitamin master]$ ls -alhF
total 0
drwxr-xr-x   4 jason  staff   136B Feb 14 12:51 ./
drwxr-xr-x+ 36 jason  staff   1.2K Feb 12 12:01 ../
drwxr-xr-x  10 jason  staff   340B Feb  1 01:57 .git/
drwxr-xr-x   4 jason  staff   136B Feb 14 12:51 html/

Now let’s check out the html directory:

[~/Sites/think_vitamin master]$ ls -alhF html/
total 16
drwxr-xr-x  4 jason  staff   136B Feb 14 12:51 ./
drwxr-xr-x  4 jason  staff   136B Feb 14 12:51 ../
-rw-r--r--  1 jason  staff     3B Feb 14 12:46 home.html
-rw-r--r--  1 jason  staff     3B Feb  1 01:57 index.html

Getting Help

Invevitably there will be times when you get stuck or need a little refresher. The authors of most commands and programs knew that would happen. Accordingly, most programs allow you to specify either -h or --help as an argument. This will usually bring up a small help screen that displays the list of commands and arguments a program takes and give you a short description of each.

If you’re on a Mac or linux system, the man command will give you a much more in depth description of the options available. Not every program ships with a man page but most do. Reading through the man page will inevitably be helpful for understanding the command itself and all of the options. Often, man pages will include examples of correct usage, which is extremely helpful when you’re stuck.

If you’re still stuck, there’s always the option of doing a web search. Just type in the name of the command and the problem you’re having in to Google. Stack Overflow is another great resource for both finding help and looking up answers to your problems. Of course, Treehouse walks you through using the commands you need to accomplish tasks while earning badges.

Treehouse

Our mission is to bring affordable Technology education to people everywhere, in order to help them achieve their dreams and change the world.

Comments

Comments are closed.