Editor's note: This question has undergone several revisions that altered the nature of the problem, potentially invalidating older comments and answers; its original title was "Cannot redirect Bash output to /dev/null".
I'm trying to create a small Bash script for which I'd like to implement a silent mode. Basically I'd just like to hide most of the output by default and, in case I run it with -v, show all output.
So at the beginning of my script I've put :
#!/bin/bash
declare output=''
if [ "$1" = -v ]; then
output="&1"
else
output="/dev/null"
fi
Then in my scripts I have:
{
# whatever commands...
} > $output 2>&1
The silent mode works well. However, if I try the verbose mode, a file called either & or &1 (based on my output variable) is being created. Also, the file is empty. This is not the desired outcome: I want the output to stay on the terminal!
Is this due to the order in which I redirect or is it my variable which is wrong? EDIT: The script now works fully, by replacing "&1" as output value with "/dev/tty".
Most probably the error output is getting printed. Note that with > /dev/null only stdout is redirected and stderr is not. You can use 2>&1 to redirect stderr to stdout before redirecting stdout. Something like:
{
# whatever commands...
} > $output 2>&1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With