tee

tee is yet another one of those overlooked tools that can make your scripts do useful things very simply and cleanly. It passes its input to stdout, but it also writes it to a file at the same time. With the -a flag, it will append to the file. You could just have two echo statements writing to the standard output and to a log file, in which case you need to ensure that any changes to one output line are repeated in the matching line. Personal experience teaches that this does not happen, which causes massive confusion when the output and the log file differ slightly but significantly. The script that follows is simple enough, but the three differences between the two lines are not obvious to spot, and worse still, once identified, it is not obvious which line has the errors.

download.eps
cat bad.sh #!/bin/bash for i in 'seq -w 1 10' 14 19 13 do   j='expr $i \* $i'   echo "'date': I am 'basename $0' and I can count to ${i}," \      "which is not particularly impressive, especially as I get a bit" \      "confused after ten. I do know that the prime factors of ${i} squared are" \      "'factor $j | cut -d. -f2 | cut -c2- | tr ' ' 'x' | sed s/"^$"/"(none)"/1'" \      "which is a bit more impressive."   echo "'date': I am 'basename $0' and I can count to ${i}," \      "which is not particularly impressive, especially as I get a bit" \      "confused after ten. I do know that the prime factors ...

Get Shell Scripting: Expert Recipes for Linux, Bash, and More now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.