Last active
November 17, 2020 04:42
-
-
Save hilbix/c53d525f113df77e323d to your computer and use it in GitHub Desktop.
Run something in current context of shell, postprocessing stdout&stderr without disturbing return code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Redirect lines of stdin/stdout to some other function | |
# outfn and errfn get following arguments | |
# "cmd args.." "one line full of output" | |
: catch outfn errfn cmd args.. | |
catch() | |
{ | |
local ret o1 o2 tmp | |
tmp=$(mktemp "catch_XXXXXXX.tmp") | |
mkfifo "$tmp.out" | |
mkfifo "$tmp.err" | |
pipestdinto "$1" "${*:3}" <"$tmp.out" & | |
o1=$! | |
pipestdinto "$2" "${*:3}" <"$tmp.err" & | |
o2=$! | |
"${@:3}" >"$tmp.out" 2>"$tmp.err" | |
ret=$? | |
rm -f "$tmp.out" "$tmp.err" "$tmp" | |
wait $o1 | |
wait $o2 | |
return $ret | |
} | |
: pipestdinto cmd args.. | |
pipestdinto() | |
{ | |
local x | |
while read -r x; do "$@" "$x" </dev/null; done | |
} | |
STAMP() | |
{ | |
date +%Y%m%d-%H%M%S | |
} | |
# example output function | |
NOTE() | |
{ | |
echo "NOTE `STAMP`: $*" | |
} | |
ERR() | |
{ | |
echo "ERR `STAMP`: $*" >&2 | |
} | |
catch_example() | |
{ | |
# Example use | |
catch NOTE ERR find /proc -ls | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment