#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: ifnew FILE ifnew -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message FILE the target to compared against Compare STDIN to FILE, and only write to FILE if STDIN content differs from FILE content. Examples: Create a new file, don't update it afterwards, and update it as the content changes: $ echo aaa | ifnew new-file $ stat --print='%y' new-file # timestamp 1 $ echo aaa | ifnew new-file $ stat --print='%y' new-file # timestamp 1 $ echo bbb | ifnew new-file $ stat --print='%y' new-file # timestamp 2 Only change file when content changes in a Makefile: i18.cfg: ALWAYS gen-cfg | ifnew $@ po4a $@ EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) FILE="${1:-}" eval "$(assert-arg -- "$FILE" 'FILE')" STDIN="$(mkstemp)" trap 'rm -f "$STDIN"' EXIT cat - > "$STDIN" if ! cmp -s "$STDIN" "$FILE"; then mv "$STDIN" "$FILE" fi