Использование времени в скрипте bash: как получить «нормальный» вывод? - PullRequest
0 голосов
/ 28 сентября 2011

Если я использую time в оболочке, я получаю вывод наподобие

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

Однако, если я использую ту же команду в скрипте bash, вывод будет такой

0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2176maxresident)k
0inputs+0outputs (0major+179minor)pagefaults 0swaps

Я уже нашел этот пост , но я хочу использовать time в скрипте, получая при этом тот же вывод, как если бы я использовал его в оболочке.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Вы пробовали флаг -p?

$ echo "time -p sleep 1" > x1

$ bash x1
real 1.01
user 0.00
sys 0.00
2 голосов
/ 29 сентября 2011
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2176maxresident)k
0inputs+0outputs (0major+179minor)pagefaults 0swaps

... - это вывод по умолчанию, генерируемый GNU-версией внешней time команды .

real    0m1.003s
user    0m0.000s
sys     0m0.000s

... - это вывод по умолчанию, создаваемый встроенной bash time. Данная встроенная версия time является расширением bash: POSIX-совместимая оболочка не требуется для предоставления встроенной версии time.

Однако POSIX действительно указывает внешнюю утилиту time , которая может использовать опцию -p для создания еще одного выходного формата:

real 1.01
user 0.00
sys 0.00

... и встроенный bash также принимает опцию -p для создания того же формата вывода.


Встроенный bash должен прекрасно работать в скрипте оболочки , если скрипт действительно запускается bash:

$ cat time.sh
#!/bin/bash
time sleep 1
$ ./time.sh

real    0m1.001s
user    0m0.000s
sys     0m0.000s
$

Похоже, ваш скрипт вызывает внешнюю утилиту, а не встроенную bash.

Наиболее вероятная причина этого:

  1. ваш сценарий говорит #!/bin/sh вместо #!/bin/bash; и
  2. /bin/sh на вашем компьютере на самом деле не bash, а более легкая POSIX-совместимая оболочка без расширений bash (как в наши дни встречается в некоторых дистрибутивах Linux).

Решение состоит в том, чтобы убедиться, что скрипт специально вызывает bash, используя #!/bin/bash, если он использует bash расширения.

1 голос
/ 28 сентября 2011

Разница в том, что выход по каналу не идет на терминал.

Коды терминала, необходимые для правильной разметки, не работают с файловым потоком.

Чего ты хотел достичь? Если вы хотите получить «скриншот», взгляните на script

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...