7

stdin と stderr をファイルにリダイレクトし、一連の処理を行ってから、それらのリダイレクトを元に戻し、ファイルの内容に対してアクションを実行するスクリプトが必要です。私はしようとしています:

function redirect(){
   exec 3>&1
   exec 4>&2
   exec 1>outfile 2>&1
}
function undirect(){
   exec 1>&3
   exec 2>&4
}
echo first
redirect
echo something
cat kjkk
undirect
if some_predicate outfile; then echo ERROR; fi

これは私が望むことをしているようですが、かなり複雑に思えます。これを行うためのよりクリーンで明確な方法はありますか?

4

2 に答える 2

9

何がいつどこに行くかを事前に知らずに、本当に前後に切り替える必要がある場合は、それがほとんどの方法です。要件によっては、リダイレクトが必要な部分を分離し、次のようにグループとして実行する方が適切な場合があります。

echo first
{
  echo something
  cat kjkk
} 1>outfile 2>&1
if some_predicate outfile; then echo ERROR; fi

これ{}はグループ コマンドと呼ばれ、グループ全体からの出力がリダイレクトされます。必要に応じて、サブシェルにのみ影響するため、サブシェルで exec を実行できます。

echo first
(
  exec 1>outfile 2>&1

  echo something
  cat kjkk
)
if some_predicate outfile; then echo ERROR; fi

ここでは中かっこ(最初の例で使用した)()ではなく、かっこを使用していることに注意してください。{}

HTH

于 2011-04-27T17:55:32.117 に答える
3

それは私にはかなりきれいに思えます。関数の外部でファイル名を使用するため、「outfile」名をパラメーターとして関数に渡すだけです。

redirect() {
    exec 3>&1
    exec 4>&2
    exec 1>"$1" 2>&1
}
:
redirect outfile
:
if some_predicate outfile; ...
于 2011-04-27T17:56:38.600 に答える