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 安定版で 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
同じことを行う文書化されていない機能があります。この場合、目的は明らかです。これは、BSD が拡張正規表現に使用するフラグとの互換性を提供しますsed
。文書化されていない理由の 1 つは、GNU が将来的に他の目的でオプションを使用できるようにするためです-E
。TIMEFORMAT で許可しながら文書化されていない理由も%E
同様である可能性があります。