简体   繁体   中英

Automatically capture all stderr and stdout to a file and still show on console

I'm looking for a way to capture all standard output and standard error to a file, while also outputting it to console. So:

(set it up here)
set -x # I want to capture every line that's executed too
cat 'foo'
echo 'bar'

Now the output from foo and bar, as well as the debugging output from set -x, will be logged to some log file and shown on the console.

I can't control how the file is invoked, so it needs to be set up at the start of the file.

You can use exec and process substitution to send stdout and stderr inside of the script to tee. The process substitution is a bashism, so it is not portable and will not work if bash is called as /bin/sh or with --posix.

exec > >(tee foo.log) 2>&1
set -x # I want to capture every line that's executed too
cat 'foo'
echo 'bar'
sleep 2 

The sleep is added to the end because the output to the console will be buffered by the tee. The sleep will help prevent the prompt from returning before the output has finished.

If you like only STDERR on your console you can:

#!/bin/bash
set -e 
outfile=logfile

exec > >(cat >> $outfile)
exec 2> >(tee -a $outfile >&2)

# write your code here

Maybe create a proxy-script that calls the real script, redirecting stderr to stdout and piping it to tee ?

Something like this:

#!/bin/bash
/path/to/real/script "$@" 2>&1 | tee file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM