web-dev-qa-db-ja.com

Bashでリダイレクトを停止する方法

私が使う :

exec >script.log 2>&1

スクリプトですべての出力をファイルにリダイレクトします。スクリプトの最後に、メッセージを画面に出力したいと思います。リダイレクトを停止するにはどうすればよいですか?

8
Willem

execを再度呼び出して、元の記述子を復元できます。それらをどこかに保存しておく必要があります。

exec 3>&1 4>&2 1>script.log 2>&1
… logged portion …
exec 1>&3 2>&4
echo >&2 "Done"

ログに記録された部分では、追加の記述子にリダイレクトすることにより、1つのコマンドに元の記述子を使用できます。

echo "30 seconds remaining" >&3

または、スクリプトのログに記録された部分を複合コマンド内に配置して、その複合コマンドをリダイレクトすることもできます。リダイレクトされた部分内のどこかにあるトラップで元の記述子を使用する場合、これは機能しません。

{
… logged portion …
} >script.log 2>&1
echo >&2 "Done"

Stdoutとstderrに追加のfd 3と4を使用し、スクリプトの最後で単純に1と2をリダイレクトします。

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"
6
rush

最初に、ttyがあるかどうかを確認する必要があります。

if tty -s; then
    echo "Hello, World" > $(tty)
fi
1
David Baggerman