diff options
-rw-r--r-- | deps.mk | 1 | ||||
-rwxr-xr-x | src/ifok | 40 |
2 files changed, 41 insertions, 0 deletions
@@ -4,6 +4,7 @@ sources.sh = \ src/color \ src/htmlesc \ src/ifnew \ + src/ifok \ src/mandir \ src/minutes \ src/mkdtemp \ diff --git a/src/ifok b/src/ifok new file mode 100755 index 0000000..9b75a9f --- /dev/null +++ b/src/ifok @@ -0,0 +1,40 @@ +#!/bin/sh +set -euo pipefail + +usage() { + cat <<-'EOF' + Usage: + ifok [-o OUTFILE] COMMAND... + EOF +} + +OUTFILE='/dev/stdout' +while getopts 'o:' flag; do + case "$flag" in + (o) + OUTFILE="$OPTARG" + ;; + (*) + usage >&2 + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + + +if [ -w "$(dirname -- "$OUTFILE")" ]; then + TEMPFILE="$OUTFILE.$(uuid).tmp" +else + TEMPFILE="$(mkstemp)" +fi +trap 'rm -f "$TEMPFILE"' EXIT + +STATUS=0 +"$@" > "$TEMPFILE" || STATUS=$? + +if [ "$STATUS" = 0 ]; then + mv "$TEMPFILE" "$OUTFILE" 2>/dev/null || cp "$TEMPFILE" "$OUTFILE" +fi + +exit "$STATUS" |