0

I have a (BASH) shell script that executes several PHP files. As they execute (over several seconds) they produce output. I am trying to capture this output from the shell script and prepend a timestamp on each line.

I am close, but need a little help.

Consider the following PHP script:

<?php
    echo("this is some output\n");
    sleep(1);
    echo("another line of output\n");
    sleep(3);   
    echo("final line of output\n\n");
?>

Running that alone produces this output:

$ php ryan.php
this is some output
another line of output
final line of output

Now consider the following shell script:

#!/bin/bash

shopt -s expand_aliases
alias date='date "+%a %d-%b-%Y %R:%S"'
alias stamp='sed "s/^/$(date)  /"'

php ryan.php | stamp
sleep 1

php ryan.php | stamp
sleep 1

exit 0

Running the following command produces the following output:

$ ./test.sh
Tue 23-Jun-2015 10:14:48  this is some output
Tue 23-Jun-2015 10:14:48  another line of output
Tue 23-Jun-2015 10:14:48  final line of output
Tue 23-Jun-2015 10:14:48
Tue 23-Jun-2015 10:14:53  this is some output
Tue 23-Jun-2015 10:14:53  another line of output
Tue 23-Jun-2015 10:14:53  final line of output
Tue 23-Jun-2015 10:14:53

As you can see, the timestamps are printing. However, they're all the same time for each line of output per PHP script execution, when instead there should be a few seconds of difference between each line of output.

I believe this is happening because the date command is evaluated only once per line in the shell script, when I would like to have it reevaluated each time there is new output from the PHP script.

Is this possible?

Update
I found the following to be my final solution:

#!/bin/bash

shopt -s expand_aliases
FMT='%a %d-%b-%Y %R:%S'
alias stamp="perl -p -MPOSIX -e 'BEGIN { $|=1 } {\$!=1} \$_ = strftime(\"$FMT  \", localtime).\$_'"

php ryan.php | stamp
sleep 1

php ryan.php | stamp
sleep 1

exit 0
Ryan Steffer
  • 425
  • 6
  • 10

0 Answers0