以下を考慮してください。
# 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