コンソールから切れたプロセスの標準出力をつなげなおす

コンソールから切れたプロセスを標準出力につなげなおす - 絶品ゆどうふのタレ に、gdbを使って稼働中のプロセスの標準出力、標準エラー出力を繋ぎ直す話が載っていた。
.bash_profileからscreenを起動しているので、ここに書かれた事態に陥ることはまず無いのだが、記憶するためにシェルスクリプトにしておく。

#!/bin/bash
usage(){
    cat <<-EOF >&2 ; exit $1
    Usage:
    既存プロセスの標準出力と標準エラー出力を割り当て直す
    ${0##*/} PID [[-a] OUTFILE]
EOF
}
error(){
    echo "$@" >&2 ; exit 1
}

pid="$1"
test -z "$pid" && usage 0
user=$(ps h p "$pid" o user 2>/dev/null) ||
error "プロセスが見つからない"

test "$USER" = root -o "$USER" = "$user" ||
error "プロセスオーナーが自分ではない"

FLAG=0001 # O_WRONLY

out="$2"
case "$out" in
"") out=/dev/$(ps h p $$ o tty) ;;
-a) FLAG=02001 # O_WRONLY | O_APPEND
    out="$3"
    test -z "$out" && usage 1 ;;
/*) ;;
*)  out=$PWD/$out ;;
esac
touch "$out" 2>/dev/null ||
error "出力先に書けない"

gdb -p "$pid" <<EOF
p close(1)
p open("$out", $FLAG)
p close(2)
p open("$out", $FLAG)
detach
quit
EOF