組み込み時間がパイプラインで機能しないのはなぜですか?

組み込み時間がパイプラインで機能しないのはなぜですか?

次のサンプルスクリプトがあります。

#!/usr/bin/env bash
sleep 5
printf "times cmd: "
times
printf "pipeline: "
times | ( read user sys; echo $user; )
printf "head: "
times | head -n1
printf "times cmd again: "
times

出力は次のとおりです。

$ ./test.sh 
times cmd: 0m0.003s 0m0.005s
0m0.001s 0m0.001s
pipeline: 0m0.000s
head: 0m0.000s 0m0.000s
times cmd again: 0m0.003s 0m0.006s
0m0.003s 0m0.004s

問題は、timesコマンドがパイプで使用されているときに時間をリセットするのはなぜですか?値を解析するのを防ぐ方法はありますか?

ベストアンサー1

パイプラインでは、すべてのコマンドがサブシェルで実行されます。timesシェルとそのサブシェルで費やされた時間を報告しますが、親シェルではそうではありません。

プロセスの置き換えを試すことができます。

times > >( head -n1 )
times > >( read user sys ; echo $user )

おすすめ記事