我有一个工具,它会不时地输出到标准输出,不失一般性,假设序列如下:
mysystem$ ./runme
Starting
Done
mysystem$
现在“runme”需要一段时间才能完成,所以我真的很想让 shell 给我
mysystem$ somecommand ./runme
0952 Starting
1134 Done
mysystem$
或者对此进行近似... 有什么想法吗? 很高兴看到诸如写入文件之类的事情...
编辑喜欢到目前为止的快速回复,但我应该更清楚一点……
该程序可能会生成一些中间语句,所以我非常希望 shell 能够给我
mysystem$ somecommand ./runme
0952 Starting
0959 Somewaythough
1011 Mostly done
1134 Done
mysystem$
但这很可能是不可能的......
答案1
当前的
$ ./slow
Starting ...
Nearly finished ...
All done.
期望
$./slow | ./stamp
15:31:19 Starting ...
15:31:29 Nearly finished ...
15:31:31 All done.
慢速进程
$ cat slow
#!/usr/bin/ksh
echo Starting ...
sleep 10
echo Nearly finished ...
sleep 2
echo All done.
时间戳器
$ cat stamp
#!/usr/bin/perl
use strict;
use warnings;
while(<>) {
my($sec, $min, $hour) = (localtime)[0..2];
print "$hour:$min:$sec $_";
}
事实上,我很惊讶这个方法有效,我以为我必须对缓冲做些什么。YMMV
使用sprintf
来格式化时间留给读者作为练习。
为了高尔夫球手
$ ./slow | perl -n -e 'printf "%02d:%02d:%02d %s", (localtime)[2,1,0],$_'
15:42:17 Starting ...
15:42:27 Nearly finished ...
15:42:29 All done.
答案2
您可以将其放在time
要执行的命令前面,它就会计时执行。
user@hostname/pwd$ time ls
file1
file2
file3
real 0m0.006s
user 0m0.001s
sys 0m0.003s
更长的命令可以使时间变得更加有趣。
答案3
关于什么:
ls -la
total 28
drwxr-xr-x 2 glens glens 27 2011-06-16 09:27 ./
drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
-rwxrwxrwx 1 glens glens 406 2011-06-16 09:27 SERVER_LOG.txt*
与sed
ls -la | sed -e "s/\(.*\)/$(date +%H%M) \1/"
1154 total 28
1154 drwxr-xr-x 2 glens glens 27 2011-06-16 09:27 ./
1154 drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
1154 -rwxrwxrwx 1 glens glens 406 2011-06-16 09:27 SERVER_LOG.txt*
答案4
在命令之前显示一个时间戳,在命令之后显示另一个时间戳:
### show current time for each command
## after the command:
PS1='[\t]'"$PS1"
## before the command:
trap 'echo [$( date +%H:%M:%S)]' DEBUG
输出示例:
me@mycomp MINGW64 ~/Projects/myproject (master)
$ php -v
[16:03:41]
PHP 8.0.14 (cli) (built: Dec 16 2021 10:25:26) ( ZTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
[16:03:41]