diff options
-rw-r--r-- | Makefile | 3 | ||||
-rwxr-xr-x | re! | 48 |
2 files changed, 50 insertions, 1 deletions
@@ -15,8 +15,9 @@ EXEC != ls -l | perl -ne ' \ } \ } \ ' +IEXEC != echo $(EXEC) | sed -E 's,^| ,&/usr/local/bin/,g' install: install -m 644 *.1 /usr/local/man/man1/ install $(EXEC) /usr/local/bin - ./re! `echo $(EXEC) | sed -E 's,^| ,&/usr/local/bin/,g'` + re! $(IEXEC) @@ -0,0 +1,48 @@ +#!/usr/bin/env perl + +# re! -- rewrite shebangs + +use strict; + +my $test = 0; +sub usage { die "usage: $0 [-n] file ...\n" } + +if (@ARGV and $ARGV[0] eq '-n') { + $test = 1; + shift @ARGV; +} +usage if not @ARGV; + +for my $file (@ARGV) { + open my $o, '<', $file or die "could not open $file: $!\n"; + + # parse shebang + my $shebang = <$o>; + $shebang =~ /^#!/ or die "no shebang: $file\n"; + $shebang =~ /^#!\s*(\S+)\s*(.*)/; + my ($old, $args) = ($1, $2); + + # validate path + next if -x $old; + + # get new path + (my $basename = $old) =~ s,.*/,,; + chomp(my $new = `which $basename`); + $new or die "could not find $basename\n"; + next if $old eq $new; + + # print results if test + if ($test) { + print "$file: $old -> $new\n"; + next; + } + + # write new shebang + open my $n, '>', "$file.tmp" or die "could not open $file.tmp: $!\n"; + print $n "#!$new $args\n"; + print $n $_ while <$o>; + + close for ($o, $n); + system('mv', "$file.tmp", $file) == 0 + or die "could not overwrite $file\n"; +} |