summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2025-03-27 08:11:10 -0300
committerEuAndreh <eu@euandre.org>2025-03-27 08:11:10 -0300
commit4f04315c3c539e0f1f6b1aa7af76ff6c261b44cf (patch)
treececcfe8f7d43fefa777c9814071b0fb4a39884e1 /src
parentsrc/mandir: Add first draft (diff)
downloadeut-4f04315c3c539e0f1f6b1aa7af76ff6c261b44cf.tar.gz
eut-4f04315c3c539e0f1f6b1aa7af76ff6c261b44cf.tar.xz
src/ifok: Add working utility
Diffstat (limited to 'src')
-rwxr-xr-xsrc/ifok40
1 files changed, 40 insertions, 0 deletions
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"