#!/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"; }