From ce6c0f31778913bcbf7ccd245ab390dddd8a1361 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Fri, 29 Apr 2011 19:44:52 +0200 Subject: [PATCH] Remove long-stading limitation from FindBin MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The FindBin documentation states as a known bug that it will return a wrong result if a script of the same name as the current one exists in $PATH, and is executable. This patch removes the functionality of searching through $PATH. According to Graham Barr it was only necessary because the SysV shell on Sun4OS4 was broken - a system where I can't imagine anybody wanting (and successfully compiling) a modern perl. On Linux this part wasn't necessary in the case of `perl -S scriptname', tests on other platforms are very welcome. As a side effect, this patch also removes some IO operations, speeding up FindBin slightly. This patch is based on discussions with Tina Müller. Further "discussion": http://www.perlmonks.org/?node_id=41213 --- lib/FindBin.pm | 41 +---------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/lib/FindBin.pm b/lib/FindBin.pm index 892d6e5..cf6ecf2 100644 --- a/lib/FindBin.pm +++ b/lib/FindBin.pm @@ -59,21 +59,6 @@ workaround was to force the C block to be executed again: delete $INC{'FindBin.pm'}; require FindBin; -=head1 KNOWN BUGS - -If perl is invoked as - - perl filename - -and I does not have executable rights and a program called -I exists in the users C<$ENV{PATH}> which satisfies both B<-x> -and B<-T> then FindBin assumes that it was invoked via the -C<$ENV{PATH}>. - -Workaround is to invoke perl as - - perl ./filename - =head1 AUTHORS FindBin is supported as part of the core perl distribution. Please send bug @@ -103,7 +88,7 @@ use File::Spec; %EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]); @ISA = qw(Exporter); -$VERSION = "1.50"; +$VERSION = "1.51"; # needed for VMS-specific filename translation @@ -145,30 +130,6 @@ sub init } else { - my $dosish = ($^O eq 'MSWin32' or $^O eq 'os2'); - unless(($script =~ m#/# || ($dosish && $script =~ m#\\#)) - && -f $script) - { - my $dir; - foreach $dir (File::Spec->path) - { - my $scr = File::Spec->catfile($dir, $script); - - # $script can been found via PATH but perl could have - # been invoked as 'perl file'. Do a dumb check to see - # if $script is a perl program, if not then keep $script = $0 - # - # well we actually only check that it is an ASCII file - # we know its executable so it is probably a script - # of some sort. - if(-f $scr && -r _ && ($dosish || -x _) && -s _ && -T _) - { - $script = $scr; - last; - } - } - } - croak("Cannot find current script '$0'") unless(-f $script); # Ensure $script contains the complete path in case we C -- 2.7.4