Skip Menu |
Report information
Id: 89698
Status: resolved
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: tinita <cpan2 [at]>

Operating System: (no value)
PatchStatus: HasPatch
Severity: low
  • library
  • Patch
Perl Version: (no value)
Fixed In: (no value)

Subject: Remove PATH-searching in FindBin
Date: Mon, 2 May 2011 19:16:06 +0200 (CEST)
To: perlbug [...]
From: Tina Müller <cpan2 [...]>
Download (untitled) / with headers
text/plain 5.3k
This is a bug report for perl from, generated with the help of perlbug 1.36 running under perl 5.10.0. ----------------------------------------------------------------- [Please enter your report here] FindBin checks $ENV{PATH} for the current script name if $0 is not absolute (and doesn't contain / or \). This has only historical reasons (on SunOS4 there was a broken shell where $0 was not absolute wenn calling a script through PATH). So when a script uses FindBin and is called by $ perl or $0 is only set to under the broken shell PATH is searched. In all other cases it takes the CWD and $0. So this feature is/was only useful for the case: - SunOS - broken shell - invoking the script via PATH. I assume that anyone running a very old SunOS with that very old broken shell would not want to or even be able to install perl >= 5.14. Unfortunately though, this feature will result in wrong paths when calling $ perl under certain circumstances. If is not executable and there is a found elsewhere in PATH which is executable this one is taken instead of the actually called script. This is documented with the workaround to call $ perl ./ So we have a feature that is very probably not needed anymore and at the same time giving wrong results, needing a workaround to prepend "./" to the path. Since FindBin is very handy, having the path in a variable so you can easily use it several times, like use lib "$Bin/../lib", "$Bin/../../project1/lib", ...; I would suggest to remove that old "feature" so that FindBin can be recommended again as an easy way to obtain the script directory. Also there should be mentioned in the docs that FindBin might give wrong results if a chdir() happened before FindBin is loaded (if not called with an absolute path). This is also the case now under certain circumstances (*) so removing PATH searching will not remove a useful feature. Attached is a patch written by Moritz Lenz. (*) Just one example for a wrong result: /home/user/ executable and does BEGIN { chdir "/usr/bin/" } /usr/bin/ executable /home/user $ perl # calls /home/user/ since . is in PATH but reports /usr/bin as $FindBin::Bin (or dies if there is no /usr/bin/ [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=library severity=low --- Site configuration information for perl 5.10.0: Configured by Debian Project at Fri Aug 28 22:30:10 UTC 2009. Summary of my perl5 (revision 5 version 10 subversion 0) configuration: Platform: osname=linux, osvers=2.6.26-2-amd64, archname=i486-linux-gnu-thread-multi uname='linux puccini 2.6.26-2-amd64 #1 smp fri aug 14 07:12:04 utc 2009 i686 gnulinux ' config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dd_dosuid -des' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=undef, use64bitall=undef, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize='-O2 -g', cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include' ccversion='', gccversion='4.3.2', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=4, prototype=define Linker and Libraries: ld='cc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib /usr/lib64 libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt perllibs=-ldl -lm -lpthread -lc -lcrypt libc=/lib/, so=so, useshrplib=true, gnulibc_version='2.7' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib' Locally applied patches: --- @INC for perl 5.10.0: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl . --- Environment for perl 5.10.0: HOME=/home/tina LANG=de_DE.UTF-8 LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/local/bin:/usr/bin:/bin:/usr/games PERL5LIB= PERL_BADLANG (unset) SHELL=/bin/bash
Download FindBin.patch
text/plain 3.1k

Message body is not shown because sender requested not to inline it.

RT-Send-CC: perl5-porters [...], moritz [...]
Download (untitled) / with headers
text/plain 124b
On Mon May 02 10:17:02 2011, tinita wrote: Show quoted text
> Attached is a patch written by Moritz Lenz.
Thank you. Applied as ce6c0f3177.

This service is sponsored and maintained by Best Practical Solutions and runs on infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at