summaryrefslogtreecommitdiff
path: root/src/ifok
blob: 9b75a9fc994e99e4790fcaa740a4c2f26acae3a3 (plain) (blame)
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
#!/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"