为什么我的选项卡没有在 TIMEFORMAT 中展开?

为什么我的选项卡没有在 TIMEFORMAT 中展开?

我需要测量应用程序的运行时间,因此我弄乱了 TIMEFORMAT 以便以可用的最大精度打印短格式。

来自 Bash 参考手册:

时间格式

此参数的值用作格式字符串,指定应如何显示以时间保留字为前缀的管道的计时信息。 “%”字符引入了扩展为时间值或其他信息的转义序列。转义序列及其含义如下;大括号表示可选部分。

%% 文字“%”。

%[p][l]R 经过的时间(以秒为单位)。

%[p][l]U 在用户模式下花费的 CPU 秒数。

%[p][l]S 在系统模式下花费的 CPU 秒数。

%P CPU 百分比,计算公式为 (%U + %S) / %R。

可选的 p 是指定精度的数字,即小数点后的小数位数。值为 0 会导致不输出小数点或分数。最多可以指定小数点后三位; p 大于 3 的值更改为 3。如果未指定 p,则使用值 3。

可选的 l 指定更长的格式,包括分钟,格式为 MMmSS.FFs。 p 的值决定是否包含分数。

如果未设置此变量,Bash 的行为就像它具有该值一样

$'\n真实\t%3lR\n用户\t%3lU\nsys\t%3lS'

如果该值为空,则不显示计时信息。显示格式字符串时会添加尾随换行符。

但是,每当我设置 TIMEFORMAT 时,选项卡和新行都不会扩展:

rafael@lip ~/time-tests $ time ls

real    0m0.099s
user    0m0.000s
sys 0m0.002s
rafael@lip ~/time-tests $ TIMEFORMAT='\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
rafael@lip ~/time-tests $ time ls
\nreal\t0m0.002s\nuser\t0m0.000s\nsys\t0m0.002s

为什么?以及如何解决?

答案1

shell 不解释单引号内的任何反斜杠。如果您希望解释反斜杠,请使用该$'...'构造,如下所示:

TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'

man bash

   Words of the form $'string'  are  treated  specially.   The  word
   expands  to string, with backslash-escaped characters replaced as
   specified by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \"     double quote
          \nnn   the  eight-bit  character  whose value is the octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadec‐
                 imal value HH (one or two hex digits)
          \uHHHH the  Unicode  (ISO/IEC 10646) character whose value
                 is the hexadecimal value HHHH (one to four hex dig‐
                 its)
          \UHHHHHHHH
                 the  Unicode  (ISO/IEC 10646) character whose value
                 is the hexadecimal value HHHHHHHH (one to eight hex
                 digits)
          \cx    a control-x character

   The  expanded  result is single-quoted, as if the dollar sign had
   not been present.

相比之下,使用普通单引号时,不会对任何字符进行任何特殊处理,如下man bash所示:

   Enclosing characters in single quotes preserves the literal value
   of  each  character  within  the  quotes.  A single quote may not
   occur between single quotes, even when preceded by a backslash.

因此,在普通单引号内,反斜杠只是反斜杠。

答案2

您必须使用美元符号$进行分配TIMEFORMAT

TIMEFORMAT=$'\n\nreal_test\t%5lR\nuser_test\t%5lU\nsys_test\t%5lS'  
time ls
....

real_test   0m0.006s
user_test   0m0.000s
sys_test    0m0.004s

相关内容