How do I conditionally redirect the output of a command to /dev/null?

Got the idea from another question:

#!/bin/sh

if [ $SILENT ]; then
    exec &>/dev/null
fi

echo "Silence here."

You could write a wrapper function:

redirect_cmd() {
    # write your test however you want; this just tests if SILENT is non-empty
    if [ -n "$SILENT" ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

You can then use it to run any command with the redirect:

redirect_cmd echo "unsilenced echo"
redirect_cmd ls -d foo*

SILENT=1
redirect_cmd echo "nothing will be printed"
redirect_cmd touch but_the_command_is_still_run

(If all you need to do is echo with this, you can of course make the function simpler, just echoing the first argument instead of running them all as a command)

Tags:

Bash

Redirect