Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bash script write executing time in a file

Tags:

bash

I need to write the time taken to execute this command in a txt file:

time ./program.exe

How can I do in bash script?

I try with >> time.txt but that doesn't work (the output does not go to file and does go to the screen).

like image 310
NikM Avatar asked Nov 01 '12 11:11

NikM


People also ask

How do you time a bash script?

Using Bash Shell's TIMEFORMAT The TIMEFORMAT is a string format that will be printed after the execution of the block code inside the time{} wrapper finishes. The %R specifies to print the elapsed time in seconds with milliseconds precision. Let's test our script: $ ./elapsed_time.sh It took 12.008 seconds.

How do I execute a shell script execution time?

Simply use echo or printf to display the value of the SECONDS variable. In the example above, we are using the echo command to print the amount of seconds like so: echo "It took $SECONDS seconds for this script to execute."

How do I print the current time in bash?

Sample shell script to display the current date and time #!/bin/bash now="$(date)" printf "Current date and time %s\n" "$now" now="$(date +'%d/%m/%Y')" printf "Current date in dd/mm/yyyy format %s\n" "$now" echo "Starting backup at $now, please wait..." # command to backup scripts goes here # ...


1 Answers

Getting time in bash to write to a file is hard work. It is a bash built-in command. (On Mac OS X, there's an external command, /usr/bin/time, that does a similar job but with a different output format and less recalcitrance.)

You need to use:

(time ./program.exe) 2> time.txt

It writes to standard error (hence the 2> notation). However, if you don't use the sub-shell (the parentheses), it doesn't work; the output still comes to the screen.


Alternatively, and without a sub-shell, you can use:

{ time ./program.exe; } 2> time.txt

Note the space after the open brace and the semi-colon; both are necessary on a single line. The braces must appear where a command could appear, and must be standalone symbols. (If you struggle hard enough, you'll come up with ...;}|something or ...;}2>&1. Both of these identify the brace as a standalone symbol, though. If you try ...;}xyz, the shell will (probably) fail to find a command called }xyz, though.)


I need to run more command in more terminal. If I do this:

 xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2

it doesn't work and tells me Syntax error: "(" unexpected. How do I fix this?

You would need to do something like:

xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2"

The key change is to run the shell with the script coming from the argument to the -c option; you can replace sh with /bin/bash or an equivalent name. That should get around any 'Syntax error' issues. I'm not quite sure what triggers that error, though, so there may be a simpler and better way to deal with it. It's also conceivable that xterm's -e option only takes a single string argument, in which case, I suppose you'd use:

xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'

You can manual bash xterm as well as I can.

I'm not sure why you run the timed program in background mode, but that's your problem, not mine. Similarly, the sleep 2 is not obviously necessary if the hold: true keeps the terminal open.

like image 79
Jonathan Leffler Avatar answered Nov 15 '22 13:11

Jonathan Leffler