TIMEFORMATでタブが展開されないのはなぜですか?

TIMEFORMATでタブが展開されないのはなぜですか?

私のアプリケーションの実行時間を測定する必要があるので、可能な最大精度で短い形式を印刷するためにTIMEFORMATを台無しにしました。

Bashリファレンスマニュアルから:

時間形式

このパラメーターの値は、時刻予約語が先に付けられたパイプのタイミング情報の表示方法を指定する形式文字列として使用されます。 「%」文字は、時間値やその他の情報に拡張されるエスケープシーケンスを紹介します。エスケープシーケンスとその意味は次のとおりです。中括弧はオプションの部分を表します。

%% 単語「%」。

%[p][l]R 経過時間(秒)です。

%[p][l]U ユーザーモードで消費された CPU 時間 (秒)。

%[p][l]S システムモードで消費された CPU 時間 (秒)。

%P CPU パーセントで、 (%U + %S) / %R として計算されます。

オプションのpは、精度、つまり小数点以下の桁数を指定する数値です。値が0の場合、小数点や小数は出力されません。小数点以下3桁まで指定でき、3より大きいp値は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

シェルは一重引用符内のバックスラッシュを解釈しません。バックスラッシュを解釈するには、$'...'次のようにこの構文を使用します。

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.

したがって、一般的な一重引用符内のバックスラッシュはバックスラッシュにすぎません。

おすすめ記事