1

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

mysystem$ ./runme
Starting
Done
mysystem$

Теперь «runme» занимает некоторое время, поэтому мне бы очень хотелось, чтобы оболочка дала мне

mysystem$ somecommand ./runme
0952 Starting
1134 Done
mysystem$

Или какое-то приближение к этому ... есть идеи? Был бы счастлив с такими вещами, как запись в файл и так далее ...

РЕДАКТИРОВАТЬ люблю быстрый ответ до сих пор, но я должен был быть более ясным ...

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

mysystem$ somecommand ./runme
0952 Starting
0959 Somewaythough
1011 Mostly done
1134 Done
mysystem$

Но это вполне может быть невозможно ...

4 ответа4

2

Вы можете поместить time перед выполнением команды, и это будет время выполнения.

user@hostname/pwd$ time ls
file1
file2
file3

real      0m0.006s
user      0m0.001s
sys       0m0.003s

Более длинные команды делают для более интересных таймингов.

2

Текущий

$ ./slow
Starting ...
Nearly finished ...
All done.

Желаемый

$./slow | ./stamp
15:31:19 Starting ...
15:31:29 Nearly finished ...
15:31:31 All done.

Медленная прога

$ cat slow
#!/usr/bin/ksh
echo Starting ...
sleep 10
echo Nearly finished ...
sleep 2
echo All done.

TimeStamper

$ cat stamp
#!/usr/bin/perl
use strict;
use warnings;
while(<>) {
  my($sec, $min, $hour) = (localtime)[0..2];
  print "$hour:$min:$sec $_";
}

На самом деле, я удивлен, что это работает, я думал, что мне нужно что-то делать с буферизацией. YMMV

Использование sprintf для форматирования времени оставлено читателю в качестве упражнения.


Для игроков в гольф

$ ./slow | perl -n -e 'printf "%02d:%02d:%02d %s", (localtime)[2,1,0],$_'
15:42:17 Starting ...
15:42:27 Nearly finished ...
15:42:29 All done.
0

Как насчет:

ls -la 
total 28
drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
-rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*

и с sed

ls -la  | sed -e "s/\(.*\)/$(date +%H%M) \1/"
1154 total 28
1154 drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
1154 drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
1154 -rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*
0

В bash вы можете комбинировать ловушку DEBUG и PROMPT_COMMAND чтобы печатать время непосредственно до и после выполнения команды.

trap 'echo $( date )' DEBUG
PROMPT_COMMAND='echo $( date )'

Вот как это выглядит (повторяется второй вывод, так как PROMPT_COMMAND является trappable командой:

$ sleep 5
Do 10 Nov 2011 18:10:36 CET
Do 10 Nov 2011 18:10:41 CET
Do 10 Nov 2011 18:10:41 CET

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .