capture.sh 687 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/bin/bash
  2. set -euo pipefail
  3. if [ "$#" == "0" ]
  4. then
  5. echo capture
  6. exit 0
  7. fi
  8. . "${BASH_SOURCE[0]%/*}"/helpers/common.sh
  9. LOG_ROOT="$HOME"/.local/var/log/shell # source this
  10. PROG="$1"
  11. SUBPROG="$(get_subprog "$@")"
  12. TIMESTAMP=$(date +%Y%m%d_%H%M%S_%N)
  13. LOG_DIR="$LOG_ROOT"/"$PROG"/"$SUBPROG"/"$TIMESTAMP"
  14. mkdir -p "$LOG_DIR"
  15. OUT="$LOG_DIR"/stdout
  16. ERR="$LOG_DIR"/stderr
  17. DAT="$LOG_DIR"/dat
  18. INF="$LOG_DIR"/info
  19. CMD="$( (set -x; : "$@") 2>&1 | cut -d: -f2- | cut -d' ' -f2-)"
  20. info(){
  21. cat <<EOF > "$INF"
  22. $CMD
  23. status=$?
  24. EOF
  25. exec 2>&-
  26. exec 1>&-
  27. wait "$err_pid" "$out_pid"
  28. }
  29. trap 'info' EXIT
  30. exec 2> >(tee -a "$DAT" "$ERR")
  31. err_pid="$!"
  32. exec 1> >(tee -a "$DAT" "$OUT")
  33. out_pid="$!"
  34. "$@"