내 응용 프로그램의 실행 시간을 측정해야 하므로 가능한 최대 정밀도로 짧은 형식을 인쇄하기 위해 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.
따라서 일반적인 작은따옴표 안에 있는 백슬래시는 단지 백슬래시일 뿐입니다.
답변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