ネストされたbashコマンド(括弧内)の内部出力をあるファイルに保存し、外部出力を別のファイルに保存するにはどうすればよいですか?

ネストされたbashコマンド(括弧内)の内部出力をあるファイルに保存し、外部出力を別のファイルに保存するにはどうすればよいですか?

これは私のコマンドです:

(time ( \
   time sleep 1; \
   time sleep 2 \
) 2>&1 | tee inner.txt ) 2>&1 | tee outer.txt

cat inner.txt示す:

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

以下cat outer.txtを表示します。

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

real    0m3.068s
user    0m0.005s
sys 0m0.008s

これをどのように入れることができますかouter.txt? :

real    0m3.068s
user    0m0.005s
sys 0m0.008s

inner.txtより良い点は、次のような、、、、outer.txtboth.txt取得する方法ですboth.txt

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

real    0m3.068s
user    0m0.005s
sys 0m0.008s

上記で使用したcmdはtimebash組み込み関数ですtimeいいえこの/usr/bin/timeコマンドは私がここの質問を通して学んだものです。timeオプションのパラメータをコマンドに渡す方法

私はLinux Ubuntu 18.04を使用しています。

この質問は、その回答を改善するための試みで、ここにある私の回答に対するフォローアップです。bashで複数行、複数のサブコマンドコマンドの時間を測定し、オプションですべての出力をファイルに保存する方法

ベストアンサー1

一方では、内部がtee外部に電源を供給していると思います。つまり、tee標準出力として印刷すると、外部レベルの他の出力と一緒に外部パイプにリダイレクトされます。また、私のBashでは、機能するには内部括弧を中括弧に変更する必要がありました(理由はわかりません)。

これはファイルとしてのみ出力されるようです。

(time { 
         time sleep 1;
         time sleep 2;
      } > inner.txt 2>&1
) > outer.txt 2>&1

出力をファイルと端末/スクリプトの標準出力の両方に出力するには、外部tee出力を「囲むように」内部出力をソートする必要があります。たとえば、スクリプトの標準出力を別の無料のファイル記述子に保存し、次の場所に印刷します。

exec 3>&1;

(time {
         time sleep 1;
         time sleep 2;
      } 2>&1 | tee inner.txt >&3
) 2>&1 | tee outer.txt >&3

>&3外部では必要ありませんが、対称性のために行いました。tee ... >/dev/tty(not必須exec)を使用して端末に直接印刷することもできますが、スクリプト全体の出力をリダイレクトまたはパイピングすると機能しません。)

上記のようにすると、myscript |tee both.txt3つの出力ファイルを取得できます。

おすすめ記事