1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#!/usr/bin/env bash
set -ueo pipefail
# Related: https://joeyh.name/code/moreutils/ sponge
usage()
{
echo 'Usage: refresh [-a] [-v] DEST'
echo ' refresh [-a] [-v] -- DEST'
}
append=''
verbose=''
while test $# -gt 0; do
case $1 in
-a) append=true; shift;;
-v) verbose=true; shift;;
--)
if test "$#" -ne 2; then
usage 1>&2
exit 2
fi
dest="$2"
shift 2
;;
-*)
usage 1>&2
exit 2
;;
*)
if test "$#" -ne 1; then
usage 1>&2
exit 2
fi
dest="$1"
shift
;;
esac
done
tmpfile="$(mktemp "$dest.sponge-XXXXXXX")"
clean-up()
{
rm -f "$tmpfile"
}
trap clean-up EXIT
# Inefficient, but should clone the permissions
if test -e "$dest"; then
cp -Lp "$dest" "$tmpfile"
fi
if test "$append"; then
cat >> "$tmpfile"
else
cat > "$tmpfile"
fi
if ! cmp -s "$tmpfile" "$dest"; then
if test "$verbose"; then
echo "Refreshed $dest" 1>&2
fi
mv "$tmpfile" "$dest"
fi
|