Command-line productivity tips : Getting help in the terminal
Tags: bash, beginners, learning, linux
Published: 2018-11-11 18:34:14

---
title: Command-line productivity tips : Getting help in the terminal
published: true
description: What to do when you are stuck in the command-line
tags: bash,beginner,learning,linux
---

The command-line is often a daunting place for beginners. With nothing but a blinking cursor and an unfriendly dark screen staring back at you, despair sets in.

Here are a few things to do if you are stuck:

### 1. How to find programs for specific tasks

Many times, you want to do a particular task but you do not remember the name of the program which does that. Many shell utilities are not easy to remember at first with their cryptic 2 letter names. 

Worry not, there is a command called **`apropos`** to help you out!

For example, you want to **show a file with line numbers**. You know that there is a program but have forgotten its name. You can just type `apropos -a line number` to get a list of programs. We use `-a` flag so that `apropos` will only return those programs which have the words **`line` AND `number`** in their description.

On my computer, it gives the following output:
```bash
apropos -a line number
# Output:
addr2line (1)        - convert addresses into file names and line numbers.
nl (1)               - number lines of files
x86_64-linux-gnu-addr2line (1) - convert addresses into file names and line numbers.
```

There are 3 programs which have something to do with numbering lines. Let's find out what each of these programs does.

### 2. Find out what a program does

Let's have a look at our first candidate `addr2line`. **Typing `--help` after the command is one way of finding out what a program does**. It is a convention for command-line programs to print a small help message when you call them with `--help`. Some programs also allow do the same on calling with `-h`.

```bash
addr2line --help
# Output:
Usage: addr2line [option(s)] [addr(s)]
 Convert addresses into line number/file name pairs.
 If no addresses are specified on the command line, they will be read from stdin
....
```

Ok. This does program does something with `addresses`, not what we are looking for. Moving on to the next in our list: `nl`

```bash
nl --help
# Output:
Usage: nl [OPTION]... [FILE]...
Write each FILE to standard output, with line numbers added.
...
```

Looks like we found our program. Let's try it out. This is our file `foo.txt`
```bash
cat foo.txt
# Output:
one
two
three

four
five
```

```bash
nl foo.txt
# Output:
     1  one
     2  two
     3  three
       
     4  four
     5  five
```
It works ok but why is it not numbering blank lines?

### 3. Getting detailed information about a program

The `--help` messages are very concise. If we want to know in detail what a program does, we need to consult the manual or `man` pages. These pages are very detailed documentation of what a program does, all its possible options and arguments. Type `man nl` and have a look at the information...

Woah! The terminal screen is filled with information!. You can navigate up and down using the arrow keys and press `q` to quit.

We can see the following in the output:
```bash
.
.

-b, --body-numbering=STYLE
              use STYLE for numbering body lines
.
.
STYLE is one of:

       a      number all lines

       t      number only nonempty lines

       n      number no lines

```

So, **`nl -b a foo.txt`** will number **all** lines in foo.txt which is what we want.
```
nl -b a foo.txt
# Output:
     1  one
     2  two
     3  three
     4
     5  four
     6  five
```

That seems to solve our problem.

There is also `info` command which gives even more detailed usage information. You can try it out using **`info nl`**.

### 4. Getting examples for using a program

But what if we just quickly want to get our command to work without having to read a huge wall of text?

Turns out, there is a nifty utility you can install called **`tldr`**. If you use `node` or `python` you can install using `npm install -g tldr` or `pip install tldr` respectively. The [tldr page](https://tldr.sh/) has a list of other installation options. After installing it, just try out `tldr nl` in your terminal

```bash
tldr nl
# Output:
nl

  A utility for numbering lines, either from a file, or from standard input.

  - Number non-blank lines in a file:
    nl file

....

  - Number all lines including blank lines:
    nl -b a file


```
There! We can see the example with easy to understand description.

`tldr` is community-driven! People contribute examples for various commands. If your favorite command does not have an entry, you can submit a [pull request](https://github.com/tldr-pages/tldr).

### Recap

To recap, we can:
- Find out possible programs which do particular tasks using **`apropos`**
- Get help information for **`$program`** using **`$program --help`** or **`man $program`**
- Get examples using **`tldr $program`**

### PS: What if we are not able to find programs for our tasks

In Section 1, we assume that we will be able to find programs for our task. But many times, we may not have it installed. In such cases, we can search our distribution's package manager e.g `apt-get` for Ubuntu or `yum` or `dnf` for CentOS / Fedora.

In Ubuntu, we can search all available packages in the repositories using `apt-cache search $KEYWORD`.