exec
when given only redirections will set them for the remainder of the script.
If you do exec 1>/tmp/myfile
, then any text that gets printed to stdout (or rather, file descriptor 1) will be sent to that file instead of your terminal. This is pretty handy for logging, particularly when you do something tricky like
exec 1> >(ts | tee -a /var/log/myscript.log)
You can also redirect a file descriptor to another file descriptor's destination. exec 3>&1
redirects fd 3 to whatever fd 1 is currently pointing to.
The 2 exec calls set fd 3 to print to the current destination for fd 1 (probably /dev/stdout) and then stdout is redirected to stderr.
If you invoke that script like
bash myscript 2>/dev/null
Then you'll only see stuff printed like echo hello >&3
The cat <&0
is odd: by default cat reads from stdin if no filenames are given. We'd have to see more context to figure out that apparent redundancy.