cattle-reset-elapsed() { (( last_cmd_at = SECONDS )) } cattle-increase-timeout() { (( timeout += 3600 )) } cattle-ping-timer() { kill -USR1 "$reaper_pid" } cattle-ping-reaper() { kill -USR2 "$reaper_pid" } cattle-slay-reaper() { kill -KILL "$reaper_pid" } cd() { command cd "$@" printf '\033]1337;CurrentDir=%s\007' "$PWD" printf %s "$PWD" > /tmp/iterm2-prev-dir.txt } { trap true EXIT # A permanently temporary workaround, since ^C outside of a # command appears to propagate to the child process. trap cattle-reset-elapsed USR1 trap cattle-increase-timeout USR2 last_cmd_at=0 timeout=3600 while sleep 10; do (( elapsed = SECONDS - last_cmd_at )) if (( elapsed > timeout )); then kill -KILL "$$" exit fi done } 2> /dev/null & reaper_pid=$! PROMPT_COMMAND+=(cattle-ping-timer) trap cattle-slay-reaper EXIT if [[ -f /tmp/iterm2-prev-dir.txt ]]; then dir=$(