K/SH で STDERR を再リダイレクトしますか?

K/SH で STDERR を再リダイレクトしますか?

STDERR がファイルなどにリダイレクトされたら、元のファイル記述子 2 に戻すにはどうすればよいですか?

#!/bin/sh
exec 2>/tmp/err
print -u2 'log errors to file'
exec 2>&2  (how do we do this???)
print -u2 'log errors to console'

コンテクスト

このリダイレクト ソリューションは、cron ジョブで機能するはずです。たとえば、cron が外部スクリプトを実行する場合、そのスクリプトは stdout と stderr をそれぞれ関連するログ ファイルとエラー ファイルにリダイレクトします。ただし、スクリプトの実行が失敗したり、ジョブ所有者に何かを報告する必要がある場合は、エラー メッセージを出力して、cron がそれを受信して​​メールを送信できるようにする必要があります。

答え1

試す:

#!/usr/bin/env ksh
exec 2>ksh_err.txt
print -u2 'log errors to file'
exec 2>`tty`
print -u2 'log errors to console'

編集1:

#!/usr/bin/env ksh

exec 8>err.txt
print -u8 'log errors to file'
print -u2 'log errors to console'

編集2:

#!/usr/bin/env ksh

exec 3>&2
exec 2>err.txt
print -u2 'log errors to file'
exec 2>&3
print -u2 'log errors to console'

関連情報