Writing to a file multiple times with Bash

I am creating a bash script to automate some commands and I am having problems writing my error checking to the same file.

#!/bin/bash

touch ErrorLog.txt

bro-cut service < conn.log | sort | uniq -c > ProtocolHierarchy.txt
if [ $? -eq 0 ]; then
    echo -e "OK Protocol Hierarchy Created\n" > ErrorLog.txt
else
    echo -e "FAILED Creating Protocol Hierarchy\n" > ErrorLog.txt
fi

bro-cut id.orig_h < dns.log | sort | uniq -c > AllIPAddresses.txt

if [ $? -eq 0 ]; then
    echo -e "OK Created all IP Addresses\n" > ErrorLog.txt
else
    echo -e "FAILED Creating all IP Addresses\n" > ErrorLog.txt
fi

      

The goal is to have a file that I can open and see if all commands were working or not, currently this file looks like

-e OK Created all IP Addresses

      

When I want it to look like

OK Protocol Hierarchy Created
OK Created all IP Addresses

      

I am really new to bash scripting, so any advice would be greatly appreciated!

+3


source to share


1 answer


Open it once and write to this file descriptor several times.

# Open (creating or truncating) the output file (only once!)
exec 3>ErrorLog.txt

# Write a line to that already-open file
echo "something" >&3

# Write a second line to that already-open file
echo "something else" >&3

# Optional: close the output file (can also be implicit when the script exits)
exec 3>&-

      

Another common idiom is to open in append mode with >>

, but doing this once per line is significantly less efficient.

# Open ErrorLog.txt, truncating if it exist, write one line, and close it
echo "something" >ErrorLog.txt

# Reopen ErrorLog.txt, write an additional line to the end, and close it again
echo "something else" >>ErrorLog.txt

      




Bringing this practice into your script (and making some better practice improvements) looks like this:

#!/bin/bash

# not related to file output, but to making sure we detect errors
# only works correctly if run with bash, not sh!
set -o pipefail ## set exit status based on whole pipeline, not just last command

# picking 3, since FD numbers 0-2 are reserved for stdin/stdout/stderr
exec 3>ErrorLog.txt

if bro-cut service <conn.log | sort | uniq -c >ProtocolHierarchy.txt; then
    echo "OK Protocol Hierarchy Created" >&3
else
    echo "FAILED Creating Protocol Hierarchy" >&3
fi

if bro-cut id.orig_h <dns.log | sort | uniq -c >AllIPAddresses.txt; then
    echo "OK Created all IP Addresses" >&3
else
    echo "FAILED Creating all IP Addresses" >&3
fi

      

+4


source







All Articles