diff options
Diffstat (limited to 'bin/sh')
-rw-r--r-- | bin/sh/builtins.def | 1 | ||||
-rw-r--r-- | bin/sh/eval.c | 26 | ||||
-rw-r--r-- | bin/sh/eval.h | 1 | ||||
-rw-r--r-- | bin/sh/sh.1 | 7 |
4 files changed, 34 insertions, 1 deletions
diff --git a/bin/sh/builtins.def b/bin/sh/builtins.def index 7bfe5d5..4dbd837 100644 --- a/bin/sh/builtins.def +++ b/bin/sh/builtins.def @@ -78,6 +78,7 @@ returncmd return setcmd set setvarcmd setvar shiftcmd shift +timescmd times trapcmd trap truecmd : true typecmd type diff --git a/bin/sh/eval.c b/bin/sh/eval.c index fecc4de..031cab3 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include <signal.h> #include <stdlib.h> #include <unistd.h> +#include <sys/resource.h> #include <sys/wait.h> /* For WIFSIGNALED(status) */ #include <errno.h> @@ -1078,3 +1079,28 @@ execcmd(int argc, char **argv) } return 0; } + + +int +timescmd(int argc __unused, char **argv __unused) +{ + struct rusage ru; + long shumins, shsmins, chumins, chsmins; + double shusecs, shssecs, chusecs, chssecs; + + if (getrusage(RUSAGE_SELF, &ru) < 0) + return 1; + shumins = ru.ru_utime.tv_sec / 60; + shusecs = ru.ru_utime.tv_sec % 60 + ru.ru_utime.tv_usec / 1000000.; + shsmins = ru.ru_stime.tv_sec / 60; + shssecs = ru.ru_stime.tv_sec % 60 + ru.ru_stime.tv_usec / 1000000.; + if (getrusage(RUSAGE_CHILDREN, &ru) < 0) + return 1; + chumins = ru.ru_utime.tv_sec / 60; + chusecs = ru.ru_utime.tv_sec % 60 + ru.ru_utime.tv_usec / 1000000.; + chsmins = ru.ru_stime.tv_sec / 60; + chssecs = ru.ru_stime.tv_sec % 60 + ru.ru_stime.tv_usec / 1000000.; + out1fmt("%ldm%.3fs %ldm%.3fs\n%ldm%.3fs %ldm%.3fs\n", shumins, + shusecs, shsmins, shssecs, chumins, chusecs, chsmins, chssecs); + return 0; +} diff --git a/bin/sh/eval.h b/bin/sh/eval.h index 2f8471e..01c914a 100644 --- a/bin/sh/eval.h +++ b/bin/sh/eval.h @@ -56,6 +56,7 @@ int returncmd(int, char **); int falsecmd(int, char **); int truecmd(int, char **); int execcmd(int, char **); +int timescmd(int, char **); int commandcmd(int, char **); /* in_function returns nonzero if we are currently evaluating a function */ diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 6fe7795..ff0cf81 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -32,7 +32,7 @@ .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" $FreeBSD$ .\" -.Dd October 29, 2005 +.Dd December 4, 2005 .Dt SH 1 .Os .Sh NAME @@ -1952,6 +1952,11 @@ A shift sets the value of $1 to the value of $2, the value of $2 to the value of $3, and so on, decreasing the value of $# by one. If there are zero positional parameters, shifting does not do anything. +.It Ic times +Print the amount of time spent executing the shell and its children. +The first output line shows the user and system times for the shell +itself, the second one contains the user and system times for the +children. .It Ic trap Oo Ar action Oc Ar signal ... Cause the shell to parse and execute .Ar action |