|
@@ -0,0 +1,45 @@
|
|
|
+#!/bin/bash
|
|
|
+set -euo pipefail
|
|
|
+if [ "$#" == "0" ]
|
|
|
+then
|
|
|
+ echo capture
|
|
|
+ exit 0
|
|
|
+fi
|
|
|
+LOG_ROOT="$HOME"/.local/var/log/shell # source this
|
|
|
+
|
|
|
+SUBPROG=""
|
|
|
+PROG="$1"
|
|
|
+if [ "$PROG" == "sudo" ]
|
|
|
+then
|
|
|
+ SUBPROG="$2"
|
|
|
+fi
|
|
|
+
|
|
|
+TIMESTAMP=$(date +%Y%m%d_%H%M%S_%N)
|
|
|
+LOG_DIR="$LOG_ROOT"/"$PROG"/"$SUBPROG"/"$TIMESTAMP"
|
|
|
+LOG_IDIR="$LOG_ROOT"/"$TIMESTAMP"/"$PROG"/"$SUBPROG"
|
|
|
+
|
|
|
+mkdir -p "$LOG_DIR" "${LOG_IDIR%/*}"
|
|
|
+ln -s "$LOG_DIR" "$LOG_IDIR"
|
|
|
+
|
|
|
+OUT="$LOG_DIR"/stdout
|
|
|
+ERR="$LOG_DIR"/stderr
|
|
|
+DAT="$LOG_DIR"/dat
|
|
|
+INF="$LOG_DIR"/info
|
|
|
+CMD="$@"
|
|
|
+
|
|
|
+info(){
|
|
|
+ cat <<EOF > "$INF"
|
|
|
+$CMD
|
|
|
+status=$?
|
|
|
+EOF
|
|
|
+ exec 2>&-
|
|
|
+ exec 1>&-
|
|
|
+ wait "$err_pid" "$out_pid"
|
|
|
+}
|
|
|
+
|
|
|
+trap 'info' EXIT
|
|
|
+exec 2> >(tee -a "$DAT" "$ERR")
|
|
|
+err_pid="$!"
|
|
|
+exec 1> >(tee -a "$DAT" "$OUT")
|
|
|
+out_pid="$!"
|
|
|
+"$@"
|