Created
April 9, 2012 14:29
-
-
Save mindreframer/2343833 to your computer and use it in GitHub Desktop.
scriptreplay for easy downloading
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w | |
# "script -t" will output a typescript with timings | |
# this script "scriptreplay" replays it | |
# run pod2man on it to get a man page | |
=head1 NAME | |
scriptreplay - play back typescripts, using timing information | |
=head1 SYNOPSIS | |
scriptreplay timingfile [typescript [divisor]] | |
=head1 DESCRIPTION | |
This program replays a typescript, using timing information to ensure that | |
output happens at the same speed as it originally appeared when the script | |
was recorded. It is only guaranteed to work properly if run on the same | |
terminal the script was recorded on. | |
The timings information is what script outputs to standard error if it is | |
run with the -t parameter. | |
By default, the typescript to display is assumed to be named "typescript", | |
but other filenames may be specified, as the second parameter. | |
If the third parameter exits, it is used as a time divisor. For example, | |
specifying a divisor of 2 makes the script be replayed twice as fast. | |
=head1 EXAMPLE | |
% script -t 2> timingfile | |
Script started, file is typescript | |
% ls | |
<etc, etc> | |
% exit | |
Script done, file is typescript | |
% scriptreplay timingfile | |
=cut | |
use strict; | |
$|=1; | |
open (TIMING, shift) | |
or die "cannot read timing info: $!"; | |
open (TYPESCRIPT, shift || 'typescript') | |
or die "cannot read typescript: $!"; | |
my $divisor=shift || 1; | |
# Read starting timestamp line and ignore. | |
<TYPESCRIPT>; | |
my $block; | |
my $oldblock=''; | |
while (<TIMING>) { | |
my ($delay, $blocksize)=split ' ', $_, 2; | |
# Sleep, unless the delay is really tiny. Really tiny delays cannot | |
# be accurately done, because the system calls in this loop will | |
# have more overhead. The 0.0001 is arbitrary, but works fairly well. | |
if ($delay / $divisor > 0.0001) { | |
select(undef, undef, undef, $delay / $divisor - 0.0001); | |
} | |
read(TYPESCRIPT, $block, $blocksize) | |
or die "read failure on typescript: $!"; | |
print $oldblock; | |
$oldblock=$block; | |
} | |
print $oldblock; | |
=head1 SEE ALSO | |
script(1) | |
=head1 COPYRIGHT | |
This program is in the public domain. | |
=head1 AUTHOR | |
Joey Hess <[email protected]> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment