Patrick Desjardins Blog
Patrick Desjardins picture from a conference

How to Silence Bash Commands

Posted on: 2024-03-21

There are ways to redirect the outputs of a terminal's command if the output is not desirable.

Before getting into the how, let's describe the concept of "File Descriptor" or fd. Using a terminal, you have three fd. The first one is the input. The terminal refers to the input file descriptor as fd 0. The second fd is the standard output, also known as stdout and fd 1. Finally, the third is the file descriptor for error, the stderr or fd 2.

FD NumberFile StreamNameDescription
0stdinWhat the user typed as argument of the command
1stdoutOutput of the command that is not error
2stderrError of the command

To silence the stdout you redirect the output using the > into the void using the destination /dev/null.

The following command:

ls 1> /dev/null

Redirect the stdout into the void, thus nothing appear in the terminal.

The following command using the file descriptor 2, the stderr, redirect error, which mean that you still see the output of the directories and files

ls 2> /dev/null

But deleting an non-existing file does not show the error:

rm testme.test 2> /dev/null

If you want to have both, the stdout and stderr silenced, then you can use:

ls 1> /dev/null 2> /dev/null

Or it's more compact form:

ls 1> /dev/null 2>& 1

The & 1 (note the space) means that the output of the file descriptor 2 goes into the file descriptor 1. The file descriptor 1 goes to /dev/null thus everything is silenced.

The 1> has a short form >. While less explicit, it reduces a character and is somewhat well known that the default is the stdout.

ls > /dev/null 2>& 1

There is also a shorter form to the common task of silencing "everything" which is to use &> without any file descriptor.

ls &> /dev/null

Instead of using ls, use rm on a file that does not exist.

> rm testme.test
rm: testme.test: No such file or directory

And then:

rm testme.test &> /dev/null

No error!