Search code examples
bashscriptinghttp-redirectstdoutstderr

Bash script - store stderr in a variable


I'm writing a script to backup a database. I have the following line:

mysqldump --user=$dbuser --password=$dbpswd  \
   --host=$host $mysqldb | gzip > $filename

I want to assign the stderr to a variable, so that it will send an email to myself letting me know what happened if something goes wrong. I've found solutions to redirect stderr to stdout, but I can't do that as the stdout is already being sent (via gzip) to a file. How can I separately store stderr in a variable $result ?


Solution

  • Try redirecting stderr to stdout and using $() to capture that. In other words:

    VAR=$((your-command-including-redirect) 2>&1)
    

    Since your command redirects stdout somewhere, it shouldn't interfere with stderr. There might be a cleaner way to write it, but that should work.

    Edit:

    This really does work. I've tested it:

    #!/bin/bash                                                                                                                                                                         
    BLAH=$((
    (
    echo out >&1
    echo err >&2
    ) 1>log
    ) 2>&1)
    
    echo "BLAH=$BLAH"
    

    will print BLAH=err and the file log contains out.