/zrun (98d1445a5f8106f04be690f85d802a7f6decfd13) (2518 bytes) (mode 100755) (type blob)
#!/usr/bin/perl
=head1 NAME
zrun - automatically uncompress arguments to command
=head1 SYNOPSIS
zrun command file.gz [...]
=head1 DESCRIPTION
Prefixing a shell command with "zrun" causes any compressed files that are
arguments of the command to be transparently uncompressed to temp files
(not pipes) and the uncompressed files fed to the command.
This is a quick way to run a command that does not itself support
compressed files, without manually uncompressing the files.
The following compression types are supported: gz bz2 Z xz lzma lzo
If zrun is linked to some name beginning with z, like zprog, and the link is
executed, this is equivalent to executing "zrun prog".
=head1 BUGS
Modifications to the uncompressed temporary file are not fed back into the
input file, so using this as a quick way to make an editor support
compressed files won't work.
=head1 AUTHOR
Copyright 2006 by Chung-chieh Shan <ccshan@post.harvard.edu>
=cut
use warnings;
use strict;
use IO::Handle;
use File::Spec;
use File::Temp qw{tempfile};
my $program;
if ($0 =~ m{(?:^|/)z([^/]+)$} && $1 ne 'run') {
$program = $1;
if (! @ARGV) {
die "Usage: z$1 <args>\nEquivalent to: zrun $1 <args>\n";
}
}
else {
$program = shift;
if (! @ARGV) {
die "Usage: zrun <command> <args>\n";
}
}
my @argument;
my %child;
foreach my $argument (@ARGV) {
if ($argument =~ m{^(.*/)?([^/]*)\.(gz|Z|bz2|xz|lzo|lzma)$}s) {
my $suffix = "-$2";
my @preprocess = $3 eq "bz2" ? qw(bzip2 -d -c) :
$3 eq "xz" ? qw(xz -d -c) :
$3 eq "lzo" ? qw(lzop -d -c) :
$3 eq "lzma" ? qw(lzma -d -c) : qw(gzip -d -c);
my ($fh, $tmpname) = tempfile(SUFFIX => $suffix,
DIR => File::Spec->tmpdir, UNLINK => 1)
or die "zrun: cannot create temporary file: $!\n";
if (my $child = fork) {
$child{$child} = $argument;
$argument = $tmpname;
}
elsif (defined $child) {
STDOUT->fdopen($fh, "w");
exec @preprocess, $argument;
}
else {
die "zrun: cannot fork to handle $argument: $!\n";
}
}
push @argument, $argument;
}
while (%child and (my $pid = wait) != -1) {
if (defined(my $argument = delete $child{$pid})) {
if ($? & 255) {
die "zrun: preprocessing for $argument terminated abnormally: $?\n";
}
elsif (my $code = $? >> 8) {
die "zrun: preprocessing for $argument terminated with code $code\n";
}
}
}
my $status = system $program ($program, @argument);
if ($status & 255) {
die "zrun: $program terminated abnormally: $?\n";
}
else {
my $code = $? >> 8;
exit $code;
}
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
44 |
5d425843f23db3bb6970a55c953f345e3a8c8fe1 |
.gitattributes |
100644 |
blob |
312 |
61108da49ae51ca3264e1760adad5687f92a5885 |
.gitignore |
100644 |
blob |
17989 |
b7b5f53df1412df1e117607f18385b39004cdaa2 |
COPYING |
100644 |
blob |
1358 |
1e92f61cafa421314e36fd80143cbcaed203182f |
Makefile |
100644 |
blob |
1181 |
1bb90af3a954062b79c41840a150e8580dfec37a |
README |
100755 |
blob |
2180 |
e24e582e864d1abcaddd07d9365d632ecc2abc13 |
chronic |
100755 |
blob |
3047 |
7f311d7aa58631795fcad87aa8fcc0f416a01796 |
combine |
040000 |
tree |
- |
110cc7de427febd97af031d9a08961b7063ff944 |
debian |
100644 |
blob |
5102 |
d2f68a1ac365a0c8df88d4b64a400f63fffe4c69 |
errno.c |
100644 |
blob |
3877 |
8d9b4acf28e4e85244dc43dce7fbf35bb2171f80 |
errno.docbook |
100644 |
blob |
13670 |
99f30e9cebf9b90b8a283b02e2db5c47d11f2ca5 |
ifdata.c |
100644 |
blob |
7339 |
47f414301c47a69a81694c3b5affd71261207d49 |
ifdata.docbook |
100644 |
blob |
3027 |
ff648cc55865f5bf9af76b9622b52b08a1b489fb |
ifne.c |
100644 |
blob |
2465 |
e9c45692b7b95e77ea0184732f883d278c9415f6 |
ifne.docbook |
040000 |
tree |
- |
943446075009f6dbdb1ebc6ab3957c0b8be01b56 |
is_utf8 |
100644 |
blob |
3996 |
f4631b2023616931670a8050227058291dda19a9 |
isutf8.docbook |
100644 |
blob |
5451 |
7bfb5e2c0376b6edaa607da00e45445b9d4ef197 |
lckdo.c |
100644 |
blob |
3637 |
3fbf797b177d6933ce106cce2e8368e5094702ab |
lckdo.docbook |
100644 |
blob |
5790 |
c5245316bf1ff46260e10caf09703f3dc7bc7db7 |
mispipe.c |
100644 |
blob |
2566 |
d65d1a45b1b47ba8d6fc7c87211cf4b26eb0feed |
mispipe.docbook |
100644 |
blob |
8666 |
8a379984714f9b8aec559ca5706e46329dd273fa |
parallel.c |
100644 |
blob |
3992 |
87e58787b21e94d007f4f62b038296599e995f2f |
parallel.docbook |
100644 |
blob |
2380 |
92df61c986e0399c3790a667a27ae2f01ff10324 |
pee.c |
100644 |
blob |
3680 |
403062997db883601e266d4c5d512d7a3b9015ca |
pee.docbook |
100644 |
blob |
7301 |
a53a2cf1906998c91533f5f5435ceeeeb1a7cd59 |
physmem.c |
100644 |
blob |
9200 |
09d3971fdb020de4da825625bd6dbbec8521d803 |
sponge.c |
100644 |
blob |
2865 |
31bc6dbc244e5e5313a2b34871877878fce24827 |
sponge.docbook |
100755 |
blob |
4574 |
4dad3d4c7b46699d100f4ea8e343be7e65f31bd4 |
ts |
100755 |
blob |
4878 |
656ce4feb1d4aff82adb122c4923c1d9d8f94e5e |
vidir |
100755 |
blob |
1403 |
2bf640dbd13f46dea540cbc49b8295d07d25a883 |
vipe |
100755 |
blob |
2518 |
98d1445a5f8106f04be690f85d802a7f6decfd13 |
zrun |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/nicolas/debian.moreutils
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/nicolas/debian.moreutils
Clone this repository using git:
git clone git://git.rocketgit.com/user/nicolas/debian.moreutils
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main