diff options
author | John Ankarström <john@ankarstrom.se> | 2021-06-29 18:39:30 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2021-06-29 18:39:30 +0200 |
commit | 8a00961524ba5bf2a65eaab1ccc496cf02471280 (patch) | |
tree | 28c7165921fbc8cc7f33509eeaabff88ecd6bf75 /re! | |
parent | 657104d7ff9ced7908a2dcf398ccee6b06fac3a6 (diff) | |
download | xutil-8a00961524ba5bf2a65eaab1ccc496cf02471280.tar.gz |
Add 're!' utility
Diffstat (limited to 're!')
-rwxr-xr-x | re! | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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"; +} |