これは私のコマンドです:
(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.txt
をboth.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はtime
bash組み込み関数です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.txt
3つの出力ファイルを取得できます。