#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: muffle [-n] [--] COMMAND... muffle -h EOF } help() { cat <<-'EOF' Options: -n invert when to do the muffling -h, --help show this message COMMAND the COMMAND to be muffled Conditionally omit STDOUT and STDERR of COMMAND: if command exits with an error, print its original output to the corresponding streams, but when there is no error, throw the output away, "muffling" the COMMAND. Examples: Only print anything if the test fails: $ muffle sh tests/assert-makefile.sh EOF } for flag in "$@"; do case "$flag" in (--) break ;; (--help) usage help exit ;; (*) ;; esac done INVERT=false while getopts 'nh' flag; do case "$flag" in (n) INVERT=true ;; (h) usage help exit ;; (*) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) export TMPDIR="$XDG_RUNTIME_DIR" OUT="$(mkstemp)" ERR="$(mkstemp)" F="$(mkstemp)" trap 'rm -f "$OUT" "$ERR" "$F"' EXIT timed() { ts -s -m '%.s' } { statusf "$F" "$@" | pre -n out | timed > "$OUT" } 2>&1 | pre -n err | timed > "$ERR" STATUS="$(cat "$F")" if [ "$INVERT" = false -a "$STATUS" != 0 ] || [ "$INVERT" = true -a "$STATUS" = 0 ]; then sort -m "$OUT" "$ERR" | cut -d' ' -f2- | awk '{ print substr($0, length($1) + 2) > "/dev/std" $1 }' exit "$STATUS" fi