I am writing a Bash script where I want all commands to be echoed as they occur. I know that I need to use set -x
and set +x
to toggle this behaviour off and on, respectively (SOF post here). However, it doesn't echo everything, namely, I/O redirects.
For example, let's say I have this very simple Bash script:
set -x
./command1 > output1
./command2 arg1 arg2 > output2
This will be the output
+ ./command1
+ ./command2 arg1 arg2
Bash is not echoing my stdout redirect to output1 and output2. Why is this? How can I achieve this behaviour? Perhaps is there a shopt
option that I must set in the script?
NOTE: I also noticed that pipes will not print as expected. For example, if I were to use this command:
set -x
./command3 | tee output3
I will get this output:
+ tee output3
+ ./command3
How do I make the commands be echoed exactly in the way they are written instead of having the pipe reordered by the script?