Bashでは通常、いくつかのtime cmd
タイプに対して次のことを行います。cmd
$ time true
real 0m0.000s
user 0m0.000s
sys 0m0.000s
出力形式を変更できます(time -pを使用してposix形式でも可能です)。
$ TIMEFORMAT='real %R'; time true
real 0.000
ただし、zshは単純なコマンドの時間を報告しません(try time echo
)。
% time true
コマンドをパイプに変換すると、他の内容が報告されます。
$ zsh -c 'time echo yes | cat'
yes
echo yes 0.00s user 0.00s system 26% cpu 0.001 total
cat 0.00s user 0.00s system 85% cpu 0.002 total
シェルがサブシェルを介して時間出力を提供するように強制できます(…)
。
$ zsh -c 'time ( true )'
( true; ) 0.00s user 0.00s system 26% cpu 0.005 total
ただし、これは機能せず、次の{…}
組み込み関数でも機能しませんfor
。
$ zsh -c 'time { for i in $(seq 100); do ls; done >/dev/null; }'
zshはどのようにサブシェルなしで簡単なコマンドを受け入れることができますか?
またはより簡単な質問:
timeキーワードを使用してksh、bash、zshで実行されるコードを書く方法はありますか?
ベストアンサー1
time
命令の時間が決まっていません。 ~からシングル Unix 仕様理由:
用語便利代わりに使用注文する、シェル複合コマンド、パイプ、特殊な組み込みコマンドなどが直接使用できないことを強調します。
これステンレス鋼time
結果も指摘された。特別な組み込みコマンドは定義されておらず、その結果は以下を除いて使用されます。簡単なコマンド(つまり、パイプまたはコマンドのグループ化で)指定されていません。
これtime
だからだいいえ特別なシェル構文は必要なく、組み込みコマンドも必要ありません。初めて標準化されたときにたくさん変わったのか、今でもたくさん変わりました。
- Almquist および (Heirloom) Bourne シェルでは、
time
これは予約語でも組み込みコマンドでもありません。外部コマンドなので、他のコマンドには適用できません。簡単なコマンド。time
BSDの外部コマンドは、wait4()
ライブラリ関数によってカーネルから返されたプロセス使用量情報を使用します。シェル組み込みコマンドとパイプの時間を測定するには、時間を測定するプログラムがシェルである必要があります。したがって、time bindkey
実行するユーティリティを見つけることができないものとtime echo
タスクタイミングなど外部echo
シェルに組み込まれていないコマンド。 - Cシェルには、
time
次のようには適用できない組み込みコマンドがあります。簡単なコマンド。待たなければならない子プロセスは、必要なtime
ライブラリ関数の結果を確認して機能します。wait4()
だからCシェルはtime
常に子プロセスを分岐します。、他の組み込みコマンドの場合も同様です。これは、time bindkey -v
子プロセスで実行された結果であるため、役に立たないことがわかりますtime
。 - Korn および Bourne Again シェルから
time
パイプに適用できるシェル構文の予約語です。これらのシェルは、ライブラリ関数から返されたサブプロセス使用情報を使用せず、代わりにwait4()
コマンド呼び出しをその呼び出しと一緒に角括弧で囲んだ後、getrusage()
それを減算して時間を計算します。 - Zシェルが
time
パイプに適用できるシェル構文の予約語。 Zシェルはライブラリ関数によってカーネルから返されたプロセス使用情報を使用しますwait4()
が、組み込みコマンドを強制的に分岐しません。だから何も報告しません。子プロセスが分岐していない場合(組み込みコマンドの場合と同様)実際に何かを達成するのtrue
と同じです。time set -o vi
基本原則に規定されているように、シングル Unix 仕様他のすべての動作を可能にするために緩く表現されています。これは、タイミングシェルの組み込みに問題があることを示します。