「time」コマンドは単独では機能しますが、パイプラインでは機能しません。

「time」コマンドは単独では機能しますが、パイプラインでは機能しません。

以下を考慮してください。

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found

まあ…え?

わかった、だから明らかにパイプラインで実行すると、Bashはやや異なる方法でコマンドを検索します。違いが何であるかを説明できる人はいますか?パイピングはシェル組み込み機能などを無効にしますか? (そうではないようですが…でも…これがどのように壊れるのかわかりません。)

答え1

シェルはbashキーワードとして実装されます。timeキーワードはパイプライン構文の一部です。

パイプの構文bashは(タイトルから」管路bashマニュアルにあります):

[time [-p]] [!] command1 [ | or |& command2 ] …

なぜならtime一部だからなパイプ構文はシェル組み込みユーティリティではないため、ユーティリティとして機能しません。たとえば、追加のトリックなしで通常のシェルリダイレクトを使用して出力をリダイレクトすることはできません(例:「時間」出力とコマンド出力を同じパイプにリダイレクトする方法は?)。

この単語がtimeパイプの先頭ではなくシェルの他の場所に現れる場合、bash同じ名前の外部コマンドが呼び出されます。timeたとえば、パイプシンボルの後ろに置くと、これが発生します。シェルが外部timeコマンドが見つからない場合は、「コマンドが見つかりません」というエラーが生成されます。

sleep 1キーワードを使用してパイプラインでシェル時間専用コマンドを作成するには、次のようにします。

echo foo | (time sleep 1)

パイプの右側にあるサブシェルでは、キーワードはパイプの先頭にありますtime(ただし、単一の単純コマンドのパイプです)。

また関連:

答え2

また、これを使用して/usr/bin/time詳細を提供することもできます。

echo foo | /usr/bin/time sleep 1

関連情報