bashのマニュアルページには、組み込みのシェルバージョンで認識される3つのフォーマットコード(time
リアルタイム%R
、%U
ユーザースペースで費やされた時間、%S
システムコールに費やされた時間)のみがリストされています。したがって、次の動作はいくら言っても混乱しています。
$ type time
time is a shell keyword
$ TIMEFORMAT="%E %P"
$ time sleep 1
1.002 0.00
マンページに何か抜けたようです。組み込み関数はとをtime
識別します。しかし、他のすべての大文字と小文字を確認しましたが、修飾子以外には何も認識されませんでした。%E
%P
l
$ TIMEFORMAT="%lE %lS %lU %lR"
$ time sleep 1
0m1.001s 0m0.000s 0m0.000s 0m1.001s
私はここで何が起こっているのか知りたいです。これは実際にはマニュアルページにありませんか、それとも私のbashに何か奇妙なことがありますか?理想的には、誰でもこれを説明する文書を教えてもらえますか?重要な場合は、Gentoo amd64 stableでbash 4.2.48(1)を使用しています。
答え1
~からexecute_cmd.c
~の一部bash-4.2+dfsg
関連TIMEFORMAT
:
if (*s == 'R' || *s == 'E')
len = mkfmt (ts, prec, lng, rs, rsf);
else if (*s == 'U')
len = mkfmt (ts, prec, lng, us, usf);
else if (*s == 'S')
len = mkfmt (ts, prec, lng, ss, ssf);
else
{
internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);
free (str);
return;
}
したがって、上から見ると、これは経過%E
(リアルタイム)時間と同じように見えます。%R
私はGNUで同様のものを見たことがありますsed
。この-r
オプションは、sedの拡張正規表現を有効にするものとして文書化されています。文書化されていない機能も-E
同じ機能を実行します。この場合、目的は明らかです。これはsed
正規表現拡張のためのBSDフラグとの互換性を提供します。文書化しない理由の1つは、GNUが-E
後で他の目的に選択的に使用できるようにすることです。 TIMEFORMATを許可し%E
てもログに記録しない理由は似ている可能性があります。