execを使用していくつかの出力をリダイレクトする安全な方法

execを使用していくつかの出力をリダイレクトする安全な方法

私はやや「騒々しい」スクリプトを持っています。スクリプトの出力の大部分がログファイルに入り、ユーザーは出力メッセージを開始するメッセージとスクリプトの終わりにのみ表示できるように出力をクリーンアップするように要求されました。これを行うには、次のようにexecを使用します。

#! /bin/bash
echo "Welcome! set up has begun, this may take a few moments..."
exec 3>&1 4>&2 1>> script.log 2>&1
# Call a bunch of other programs - stderr and stdout must
# be written to a log file to diagnose programs, but nothing out the console...
exec 1>&3 2>&4
echo "Your system is ready to use!"

ただし、このスクリプトのロギング部分にあるプログラムの1つが失敗し(これらのプログラムに対する制御権限があまりありません)、メインスクリプトが失敗した場合はどうなるのか心配です。この行がexec 1>&3 2>&4実行されないと、ユーザーがstderrとstdoutリダイレクトのために端末を使用できなくなる可能性があります。この問題を処理するより安全な方法はありますか?

ベストアンサー1

スクリプトが別々のプログラムとして実行される場合、すべてのリダイレクトはプロセスの終了後も保持されません。/bin/bash yourscript.shユーザーが実行している対話型シェルには適用されず、暗黙的にのみ適用されます。これは正常です。問題を引き起こす唯一の方法は、source yourscript.sh通常実行してはいけないか、または同様のものを使用してスクリプトを読み取ることです。

おすすめ記事