John Cremona wrote: > On a 64-bit ubuntu system I had to include the ".sh" like this: > > j...@selmer%date -u +%s && ./unixtime.sh > 1260823644 > 1260823644 > > since: > > j...@selmer%date -u +%s && ./unixtime > 1260823676 > -bash: ./unixtime: No such file or directory > > My $SHELL is /bin/bash but your script uses /bin/sh which here is > > j...@selmer%ls -l /bin/sh > lrwxrwxrwx 1 root root 4 2009-06-25 11:41 /bin/sh -> dash > > dash?
Thank you for that John, The code will actually go into the script $SAGE_ROOT/spkg/install which has at the top of it: #!/usr/bin/env bash echo `date -u "+%s"` > .BUILDSTART So my code will actually be executed with 'bash'. I want to get rid of the GNU-specific option to the date command. I guess I should have put #!/usr/bin/env bash in the script I posted, but I tend only to write scripts that make use of things supported by a minimal /bin/sh, rather than rely on any bash-specific features. I must admit I'm puzzled it needed the .sh on the end. Are you sure you had the execute permission on the version without the .sh ? I'm still puzzled though I must admit, why it says "No such file or directory", since the file clearly exists. I suppose I have never used the 'dash' shell, so don't know how it behaves. bash is considered a perquisite for Sage, though personally I tend to write thing that work with other shells. 'dash' seems pretty unique in not executing code without the .sh extension. The shells on Solaris, HP-UX, Linux, OS X and AIX all work without the .sh. So far, anyone that has posted the output and compared it with $ date +%s appears to give the same result, so I believe this will give us portability without compromising accuracy. Dave > John > > 2009/12/13 Dr. David Kirkby <[email protected]>: >> If you have a system with the GNU version of date, then >> >> date -u +%s >> >> will give the seconds since the Epoch. Unfortunately, it only works with GNU >> date, and so will not work on Solaris, HP-UX or no doubt many other Unix >> systems. >> >> The following script should compute this is a portable manner. Here's a few >> examples >> >> On sage.math, where date accepts +%s >> >> kir...@sage:~$ date -u +%s && ./unixtime >> 1260720556 >> 1260720556 >> >> >> On an HP-UX system, where date does *not* accept +%s >> >> bash-2.04$ uname -a >> HP-UX hpbox B.11.11 U 9000/785 2016698240 unlimited-user license >> bash-2.04$ ./unixtime && date -u +%s >> 1260720771 >> date: bad format character - s >> >> On an OpenSolaris system, where date does *not* accept +%s >> >> bash-3.2$ ./unixtime && date -u +%s >> 1260720823 >> %s >> >> >> On an IBM server running AIX 6.1, where date does accept +%s >> >> $ uname -a >> AIX client1 1 6 00C6B7C04C00 >> $ ./unixtime && date -u +%s >> 1260721013 >> 1260721013 >> >> >> >> For every system I am able to check this on, the following script gives >> exactly >> the same output as the GNU date command, but in a more portable manner. >> >> Could a few people check it on their systems. >> >> If it does work, I'd propose it is used in place of the GNUism introduced in >> http://trac.sagemath.org/sage_trac/ticket/6744 >> >> Currently the file .BUILDSTART created by #6744 is not actually used >> anywhere in >> Sage, but clearly the intension is to use it at some point, in which case it >> will be found not to work on some systems. >> >> Dave >> ----------------------------------------------- >> >> >> #!/bin/sh >> # Compute seconds since the Epoch. >> >> # Call 'date'. Note that >> # %Y = year including century >> # %j = day number (1-365) >> # %H = hour (0-23) >> # %M = minute (0-59) >> # %S = seconds (0-59) >> >> if type env >/dev/null 2>&1 ; then >> set -- `env LC_ALL=C LC_TIME=C LANG=C date -u '+%Y %j %H %M %S'` >> else >> set -- `date -u '+%Y %j %H %M %S'` >> fi >> >> # $1 = year including century >> # $2 = day number (1-365) >> # $3 = hour (0-23) >> # $4 = minute (0-59) >> # $5 = seconds (0-59) >> >> if [ $? -ne 0 ] || [ $# -lt 5 ] ; then >> TIME="Error computing seconds since the Epoch" >> fi >> >> DAYS=`expr 365 \* \( $1 - 1970 \) + \( $1 - 1969 \) / 4 + $2 - 1` >> TIME=`expr $5 + 60 \* \( $4 + 60 \* \( $3 + 24 \* $DAYS \) \)` >> echo $TIME >> >> >> -- >> To post to this group, send an email to [email protected] >> To unsubscribe from this group, send an email to >> [email protected] >> For more options, visit this group at >> http://groups.google.com/group/sage-devel >> URL: http://www.sagemath.org >> > -- To post to this group, send an email to [email protected] To unsubscribe from this group, send an email to [email protected] For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org
