#!/usr/bin/env perl use strict; my $operation = shift @ARGV; if ($operation !~ m/^(install|uninstall)$/) { print STDERR "$0: unknown operation $operation\n"; exit(1); } my %options = (); for my $arg (@ARGV) { if ($arg =~ m/([^=]*)=(.*)/) { $options{$1} = $2; } else { print STDERR "$0: can't parse option [$arg]\n"; exit(1); } } for my $option (qw(command directory extension file)) { unless (defined($options{$option})) { print STDERR "$0: required variable $option not provided\n"; exit(1); } } my $fh; unless (open $fh, '<', $options{file}) { print STDERR "$0: can't open links file '$options{file}': $!"; exit(1); } my @cmd = split /\s+/, $options{command}; while (my $line = <$fh>) { chomp $line; my @args = split /\s+/, $line; process(@args); } sub process { my ($source, @destinations) = @_; my @args = (@cmd); if ($operation eq 'install') { push @args, "$options{directory}/$source.$options{extension}"; } for my $destination (@destinations) { push @args, "$options{directory}/$destination.$options{extension}"; run_command(@args); pop @args; } } sub run_command { print (join ' ', @_); print "\n"; my $ret = system(@_); if ($ret != 0) { print STDERR "$0: command failed: $?\n"; exit(1); } return 1; }