From 8a00961524ba5bf2a65eaab1ccc496cf02471280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Tue, 29 Jun 2021 18:39:30 +0200 Subject: Add 're!' utility --- Makefile | 3 ++- re! | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100755 re! diff --git a/Makefile b/Makefile index 20f5c13..3c3e014 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/re! b/re! new file mode 100755 index 0000000..1314ae9 --- /dev/null +++ b/re! @@ -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"; +} -- cgit v1.2.3