How to run time on multiple commands AND write the time output to file?
Clash Royale CLAN TAG#URR8PPP
up vote
59
down vote
favorite
I want to run time
command to measure time of several commands.
What I want to do is:
- Measure the time of running of all of them added together
- Write the
time
output to a file - Write the
STDERR
from the command I am measuring toSTDERR
What I do NOT want to do is
- Write the several commands into a separate script (why? because all of this is already a script that I am generating programatically, and creating ANOTHER temporary script would be more mess than I want)
What I tried so far:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, time
is run only on the first one.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Doesn't work, (
is unexpected token.
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, "no such file or directory".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Doesn't work, "no such file or directory".
time ( echo "a"; echo "b"; ) 2>outtime
Doesn't work, since it redirects all STDERR
into outtime
; I want only the time
output there.
And of course,
time --output=outime echo "a";
Doesn't work, since --output=outime: command not found
.
How can I do it?
shell command time-utility
add a comment |Â
up vote
59
down vote
favorite
I want to run time
command to measure time of several commands.
What I want to do is:
- Measure the time of running of all of them added together
- Write the
time
output to a file - Write the
STDERR
from the command I am measuring toSTDERR
What I do NOT want to do is
- Write the several commands into a separate script (why? because all of this is already a script that I am generating programatically, and creating ANOTHER temporary script would be more mess than I want)
What I tried so far:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, time
is run only on the first one.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Doesn't work, (
is unexpected token.
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, "no such file or directory".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Doesn't work, "no such file or directory".
time ( echo "a"; echo "b"; ) 2>outtime
Doesn't work, since it redirects all STDERR
into outtime
; I want only the time
output there.
And of course,
time --output=outime echo "a";
Doesn't work, since --output=outime: command not found
.
How can I do it?
shell command time-utility
add a comment |Â
up vote
59
down vote
favorite
up vote
59
down vote
favorite
I want to run time
command to measure time of several commands.
What I want to do is:
- Measure the time of running of all of them added together
- Write the
time
output to a file - Write the
STDERR
from the command I am measuring toSTDERR
What I do NOT want to do is
- Write the several commands into a separate script (why? because all of this is already a script that I am generating programatically, and creating ANOTHER temporary script would be more mess than I want)
What I tried so far:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, time
is run only on the first one.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Doesn't work, (
is unexpected token.
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, "no such file or directory".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Doesn't work, "no such file or directory".
time ( echo "a"; echo "b"; ) 2>outtime
Doesn't work, since it redirects all STDERR
into outtime
; I want only the time
output there.
And of course,
time --output=outime echo "a";
Doesn't work, since --output=outime: command not found
.
How can I do it?
shell command time-utility
I want to run time
command to measure time of several commands.
What I want to do is:
- Measure the time of running of all of them added together
- Write the
time
output to a file - Write the
STDERR
from the command I am measuring toSTDERR
What I do NOT want to do is
- Write the several commands into a separate script (why? because all of this is already a script that I am generating programatically, and creating ANOTHER temporary script would be more mess than I want)
What I tried so far:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, time
is run only on the first one.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Doesn't work, (
is unexpected token.
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Doesn't work, "no such file or directory".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Doesn't work, "no such file or directory".
time ( echo "a"; echo "b"; ) 2>outtime
Doesn't work, since it redirects all STDERR
into outtime
; I want only the time
output there.
And of course,
time --output=outime echo "a";
Doesn't work, since --output=outime: command not found
.
How can I do it?
shell command time-utility
shell command time-utility
edited Feb 8 '16 at 23:45
Gilles
511k12010091540
511k12010091540
asked Aug 22 '12 at 4:14
Karel BÃlek
83921224
83921224
add a comment |Â
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
75
down vote
accepted
Use sh -c 'commands'
as the command, e.g.:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
add a comment |Â
up vote
6
down vote
Try this:
% (time ( echas z; echo 2 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( echas z; echo 2; 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Explanation:
First, we have to find a way to redirect the output of time
. Since time
is a shell builtin, it takes the full command line as the command to be measured, including redirections. Thus,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Note: janos's comment implies this is not the case for bash
.] We can achieve the redirection of time
's output by running time
in a subshell and then redirecting the output of that subshell.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Now we have successfully redirected the output of time
, but its output is mixed with the error output of the command we are measuring. To separate the two, we use an additional file descriptor.
On the "outside" we have
% (time ... ) 3>&2 2>timeout
This means: whatever is written to file descriptor 3, will be output to the same place file descriptor 2 (standard error) is outputting now (the terminal). And then we redirect standard error to the file timeout
.
So now we have: everything written to stdout and fd 3 will go to the terminal, and everything written to stderr will go to the file. What's left is to redirect the measured command's stderr to fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Now, to make time measure more than one command, we need to run them in an(other!) subshell (inside parentheses). And to redirect the error output of all of them to fd 3, we need to group them inside curly brackets.
So, finally, we arrive at:
% (time ( whatever; ls 2>&3 ) ) 3>&2 2>timeoutput
That's it.
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
add a comment |Â
up vote
1
down vote
Not the correct answer but very related to the question.
Get timing statistics for multiple programs combined parentheses are required. Separate commands with semicolons.
time ( command1 ; command2 )
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
75
down vote
accepted
Use sh -c 'commands'
as the command, e.g.:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
add a comment |Â
up vote
75
down vote
accepted
Use sh -c 'commands'
as the command, e.g.:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
add a comment |Â
up vote
75
down vote
accepted
up vote
75
down vote
accepted
Use sh -c 'commands'
as the command, e.g.:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
Use sh -c 'commands'
as the command, e.g.:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
answered Aug 22 '12 at 19:36
Jim Paris
11.1k42330
11.1k42330
add a comment |Â
add a comment |Â
up vote
6
down vote
Try this:
% (time ( echas z; echo 2 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( echas z; echo 2; 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Explanation:
First, we have to find a way to redirect the output of time
. Since time
is a shell builtin, it takes the full command line as the command to be measured, including redirections. Thus,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Note: janos's comment implies this is not the case for bash
.] We can achieve the redirection of time
's output by running time
in a subshell and then redirecting the output of that subshell.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Now we have successfully redirected the output of time
, but its output is mixed with the error output of the command we are measuring. To separate the two, we use an additional file descriptor.
On the "outside" we have
% (time ... ) 3>&2 2>timeout
This means: whatever is written to file descriptor 3, will be output to the same place file descriptor 2 (standard error) is outputting now (the terminal). And then we redirect standard error to the file timeout
.
So now we have: everything written to stdout and fd 3 will go to the terminal, and everything written to stderr will go to the file. What's left is to redirect the measured command's stderr to fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Now, to make time measure more than one command, we need to run them in an(other!) subshell (inside parentheses). And to redirect the error output of all of them to fd 3, we need to group them inside curly brackets.
So, finally, we arrive at:
% (time ( whatever; ls 2>&3 ) ) 3>&2 2>timeoutput
That's it.
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
add a comment |Â
up vote
6
down vote
Try this:
% (time ( echas z; echo 2 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( echas z; echo 2; 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Explanation:
First, we have to find a way to redirect the output of time
. Since time
is a shell builtin, it takes the full command line as the command to be measured, including redirections. Thus,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Note: janos's comment implies this is not the case for bash
.] We can achieve the redirection of time
's output by running time
in a subshell and then redirecting the output of that subshell.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Now we have successfully redirected the output of time
, but its output is mixed with the error output of the command we are measuring. To separate the two, we use an additional file descriptor.
On the "outside" we have
% (time ... ) 3>&2 2>timeout
This means: whatever is written to file descriptor 3, will be output to the same place file descriptor 2 (standard error) is outputting now (the terminal). And then we redirect standard error to the file timeout
.
So now we have: everything written to stdout and fd 3 will go to the terminal, and everything written to stderr will go to the file. What's left is to redirect the measured command's stderr to fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Now, to make time measure more than one command, we need to run them in an(other!) subshell (inside parentheses). And to redirect the error output of all of them to fd 3, we need to group them inside curly brackets.
So, finally, we arrive at:
% (time ( whatever; ls 2>&3 ) ) 3>&2 2>timeoutput
That's it.
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
add a comment |Â
up vote
6
down vote
up vote
6
down vote
Try this:
% (time ( echas z; echo 2 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( echas z; echo 2; 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Explanation:
First, we have to find a way to redirect the output of time
. Since time
is a shell builtin, it takes the full command line as the command to be measured, including redirections. Thus,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Note: janos's comment implies this is not the case for bash
.] We can achieve the redirection of time
's output by running time
in a subshell and then redirecting the output of that subshell.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Now we have successfully redirected the output of time
, but its output is mixed with the error output of the command we are measuring. To separate the two, we use an additional file descriptor.
On the "outside" we have
% (time ... ) 3>&2 2>timeout
This means: whatever is written to file descriptor 3, will be output to the same place file descriptor 2 (standard error) is outputting now (the terminal). And then we redirect standard error to the file timeout
.
So now we have: everything written to stdout and fd 3 will go to the terminal, and everything written to stderr will go to the file. What's left is to redirect the measured command's stderr to fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Now, to make time measure more than one command, we need to run them in an(other!) subshell (inside parentheses). And to redirect the error output of all of them to fd 3, we need to group them inside curly brackets.
So, finally, we arrive at:
% (time ( whatever; ls 2>&3 ) ) 3>&2 2>timeoutput
That's it.
Try this:
% (time ( echas z; echo 2 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( echas z; echo 2; 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Explanation:
First, we have to find a way to redirect the output of time
. Since time
is a shell builtin, it takes the full command line as the command to be measured, including redirections. Thus,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Note: janos's comment implies this is not the case for bash
.] We can achieve the redirection of time
's output by running time
in a subshell and then redirecting the output of that subshell.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Now we have successfully redirected the output of time
, but its output is mixed with the error output of the command we are measuring. To separate the two, we use an additional file descriptor.
On the "outside" we have
% (time ... ) 3>&2 2>timeout
This means: whatever is written to file descriptor 3, will be output to the same place file descriptor 2 (standard error) is outputting now (the terminal). And then we redirect standard error to the file timeout
.
So now we have: everything written to stdout and fd 3 will go to the terminal, and everything written to stderr will go to the file. What's left is to redirect the measured command's stderr to fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Now, to make time measure more than one command, we need to run them in an(other!) subshell (inside parentheses). And to redirect the error output of all of them to fd 3, we need to group them inside curly brackets.
So, finally, we arrive at:
% (time ( whatever; ls 2>&3 ) ) 3>&2 2>timeoutput
That's it.
edited Aug 23 '12 at 18:00
answered Aug 22 '12 at 6:26
angus
8,89113332
8,89113332
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
add a comment |Â
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
This is a syntax error in a POSIX shell. Probably a bashism?
â josch
Aug 1 '17 at 6:00
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
@josch the shell used here is zsh.
â angus
Aug 28 '17 at 13:22
add a comment |Â
up vote
1
down vote
Not the correct answer but very related to the question.
Get timing statistics for multiple programs combined parentheses are required. Separate commands with semicolons.
time ( command1 ; command2 )
add a comment |Â
up vote
1
down vote
Not the correct answer but very related to the question.
Get timing statistics for multiple programs combined parentheses are required. Separate commands with semicolons.
time ( command1 ; command2 )
add a comment |Â
up vote
1
down vote
up vote
1
down vote
Not the correct answer but very related to the question.
Get timing statistics for multiple programs combined parentheses are required. Separate commands with semicolons.
time ( command1 ; command2 )
Not the correct answer but very related to the question.
Get timing statistics for multiple programs combined parentheses are required. Separate commands with semicolons.
time ( command1 ; command2 )
edited Aug 31 at 10:44
ploth
848115
848115
answered Aug 31 at 7:42
Martin T.
112
112
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f46051%2fhow-to-run-time-on-multiple-commands-and-write-the-time-output-to-file%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password