ファイルにstdoutとstderrを追加する

ファイルにstdoutとstderrを追加する

私はこれを持っています:

nohup_ntrs(){
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")";
  echo " ------------- BEGIN $(date) -------------- " >> "$nohup_file"
  nohup "$@" &>> "$nohup_file"
  echo " ------------- END $(date) -------------- " >> "$nohup_file"
}

しかし、この構文は間違っています。

 nohup "$@" &>> "$nohup_file"

>>演算子を使用して追加しようとしていますが、標準エラーもそこに送信されます。私の考えでは、これを行う唯一の方法は次のとおりです。

 nohup "$@" 2>&1 >> "$nohup_file"

これを行うよりクリーンな方法はありますか?

答え1

&>>bash標準出力と標準エラーストリームをリンクスキーマファイルにリダイレクトするシェルの正しい構文です。

sh私の考えでは、おそらく何が起こっているのかは、システムは実行スクリプトではなく実行スクリプトを使用しているということですbash。または、bash最初にサポートされているバージョン4.0より前のバージョンを実行しています&>>

>>file 2>&1あなたの場合は、標準に準拠する別のアプローチを使用することです。

nohup "$@" >>"$nohup_file" 2>&1

いいえ短く標準に準拠したシェルでこれを行う方法sh

あなたの提案は、2>&1 >>file標準エラーストリームをファイルに送信するのではなく、標準出力ストリームがある場所に送信することです。最初は行くリダイレクトは左から右に処理されるためあなたのリダイレクトは、まず標準出力がある場所に標準エラーを送信します。それから追加モードでは、標準出力をファイルにリダイレクトします。つまり、2番目のリダイレクトは>>file標準エラーがどこに行くのかを変更しないため、元の標準出力があった場所に移動します(前2>&1


コードを書くもう1つの方法は次のとおりです。

nohup_ntrs () {
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")"

  {
    printf ' ------------- BEGIN %s -------------- \n' "$(date)"
    nohup "$@"
    printf ' ------------- END %s ---------------- \n' "$(date)"
  } >>"$nohup_file" 2>&1
}

出力を中括弧にリダイレクトする必要があるコマンドをグループ化し、そのコマンドをリダイレクトして単一のリダイレクトへのリダイレクトの数を減らすことができます。複合コマンド全体的に。

答え2

nohup "$@" 2>&1 | tee "$nohup_file"

あるいは、スクリプトでファイル記述子を開き、両方ともその記述子にexecリダイレクトすることもできます。stdoutstderr

関連情報