bin/overwrite

Summary

Maintainability
Test Coverage
#!/bin/sh
#
#    overwrite: copy standard output generated from another command
#    to the specified file after EOF
#
#    Refer to "The Unix Programming Environment", pp. 154

case $# in
0) echo "overwrite -- copy the standard output generated from another command"
    echo "to the specified file after EOF."
    echo
    echo "Usage 1:"
    echo "  overwrite file command arguments"
    echo
    echo "Usage 2:"
    echo "  command argments | overwrite file"
    echo
    echo "command arguments:"
    echo "  could by anything, e.g., grep abc file"
    echo "file:"
    echo "  could be the same as the file processed the command"
    echo
    echo "In Usage 1, file won't be changed if command doesn't succeed."
    exit 0;;
esac

file=$1; shift
flbase=${file##*/}
new=/tmp/$flbase.overwrite1~
old=/tmp/$flbase.overwrite2~

trap 'rm -f $new $old; exit 1' 1 2 15    #clean up upon signals

if [ $# -ge 1 ] ; then
    $* > $new
    if [ $? != 0 ] ; then
        echo "overwrite: $1 failed, $file unchanged" 1>&2
        rm -f $new $old
        trap - 1 2 15
        exit 1
    fi
else
    cat > $new
fi

#if [ -f $file ] ; then
#    cp -f $file $old    #useful if 'cp $new $file' fail
#fi

trap '' 1 2 15    #ignore signals
cp -f $new $file    #overwire (not mv) to preserve permissions
rm -f $new $old
trap - 1 2 15    #restore