mirror of
https://github.com/notwa/rc
synced 2024-12-21 21:49:40 -08:00
96 lines
3.2 KiB
Bash
Executable file
96 lines
3.2 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
# compat: +ash +bash +dash +zsh
|
|
|
|
stfu() { ### @-
|
|
### invoke a command, silencing stdout and stderr *unless* the command fails.
|
|
###
|
|
### **NOTE:** don't use `stfu` for handling sensitive data or commands!
|
|
### use it for 7zip.
|
|
###
|
|
### note that the tail commands in the example below are from `stfu` itself;
|
|
### they are echoed to reveal the temp paths for any further investigation.
|
|
###
|
|
### ```
|
|
### $ touch butts
|
|
### $ STFU_TAIL=5
|
|
### $ stfu 7z a butts.7z butts
|
|
### $ stfu 7z a butts.7z asses
|
|
### command failed with exit status 1:
|
|
### 7z a butts.7z asses
|
|
###
|
|
### $ tail -n 5 /tmp/stfu.CoJ0vmJsqA/out_1627942118
|
|
### Scan WARNINGS for files and folders:
|
|
###
|
|
### asses : The system cannot find the file specified.
|
|
### ----------------
|
|
### Scan WARNINGS: 1
|
|
###
|
|
### $ tail -n 5 /tmp/stfu.CoJ0vmJsqA/err_1627942118
|
|
###
|
|
### WARNING: The system cannot find the file specified.
|
|
### asses
|
|
###
|
|
###
|
|
### ```
|
|
argc $# -ge 1 "$0" || return
|
|
|
|
local dirty=0 temp="$STFU_DIR"
|
|
if [ -z "$temp" ]; then
|
|
temp="$(mktemp -dt stfu.XXXXXXXXXX)"
|
|
[ $? -eq 0 ] || { printf "%s\n" "$0: failed create temporary directory" >&2; return 1; }
|
|
dirty=1
|
|
fi
|
|
|
|
# NOTE: this stat command will not work on BSD-likes,
|
|
# but it will work with GNU coreutils and busybox.
|
|
local perms="$(stat -c '%a' "$temp")"
|
|
local realtemp="$(readlink -f "$temp")"
|
|
[ -z "$MSYSTEM" ] || perms=700 # MSYS2 is insecure, oh well.
|
|
|
|
if [ -d "$temp" ] && [ "$realtemp" = "$temp" ] && [ "$perms" = 700 ]; then
|
|
if [ $dirty -ne 0 ]; then
|
|
export STFU_DIR="$temp"
|
|
fi
|
|
else
|
|
if [ -n "$STFU_DIR" ]; then
|
|
printf "%s\n" "$0: invalid temporary directory, please unset STFU_DIR" >&2
|
|
else
|
|
printf "%s\n" "$0: something went horribly wrong, maybe you can tell?" "$perms" "$realtemp" >&2
|
|
fi
|
|
return 1
|
|
fi
|
|
|
|
local time="$(date -u '+%s')"
|
|
[ $? -eq 0 ] || { printf "%s\n" "$0: failed to get current time" >&2; return 1; }
|
|
|
|
mkdir -p "$temp" || { printf "%s\n" "$0: failed to create temp directory" >&2; return 1; }
|
|
|
|
while [ -e "$temp/out_$time" ] || [ -e "$temp/err_$time" ]; do time=$((time+1)); done
|
|
local out="$temp/out_$time"
|
|
local err="$temp/err_$time"
|
|
|
|
touch "$out" && touch "$err" || { printf "%s\n" "$0: failed to create temp files" >&2; return 1; }
|
|
|
|
#local out="$(mktemp -t -p "$temp" out_XXXXXX)"
|
|
#[ $? -eq 0 ] || { printf "%s\n" "$0: failed to create temp file" >&2; return 1; }
|
|
#local err="$(mktemp -t -p "$temp" err_XXXXXX)"
|
|
#[ $? -eq 0 ] || { printf "%s\n" "$0: failed to create temp file" >&2; return 1; }
|
|
|
|
local ret=0 tail="${STFU_TAIL:-20}"
|
|
"$@" > "$out" 2> "$err" || ret=$?
|
|
if [ $ret -ne 0 ]; then
|
|
printf "command failed with exit status %s:\n" $ret >&2
|
|
echo2 "$@"
|
|
echo2
|
|
note '$ tail -n' "$tail" "$out"
|
|
tail -n "$tail" "$out" >&2
|
|
echo2
|
|
note '$ tail -n' "$tail" "$err"
|
|
tail -n "$tail" "$err" >&2
|
|
fi
|
|
return $ret
|
|
}
|
|
|
|
[ -n "${preload+-}" ] || . ~/sh/preload || exit 2
|
|
eval ${preload:-preload} argc echo2 note
|
|
[ -n "${preload+-}" ] || stfu "$@"
|