我有一个(BASH)shell脚本,可以执行多个PHP文件。当它们执行(几秒钟)时,它们产生输出。我试图从shell脚本捕获此输出并在每行上添加时间戳。
我很接近,但需要一些帮助。
考虑以下PHP脚本:
<?php
echo("this is some output\n");
sleep(1);
echo("another line of output\n");
sleep(3);
echo("final line of output\n\n");
?>
单独运行会产生此输出:
$ php ryan.php
this is some output
another line of output
final line of output
现在考虑以下shell脚本:
#!/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
运行以下命令会产生以下输出:
$ ./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
如您所见,时间戳正在打印。但是,对于每个PHP脚本执行的每行输出,它们都是相同的,而在每行输出之间应该有几秒的差异。
我相信这种情况正在发生,因为date
命令在shell脚本中每行只评估一次,当我希望每次PHP脚本有新输出时都重新评估它。
这可能吗?
更新
我发现以下内容是我的最终解决方案:
#!/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