source: trunk/essentials/dev-lang/perl/lib/FindBin.pm@ 3314

Last change on this file since 3314 was 3181, checked in by bird, 19 years ago

perl 5.8.8

File size: 5.3 KB
Line 
1# FindBin.pm
2#
3# Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
4# This program is free software; you can redistribute it and/or modify it
5# under the same terms as Perl itself.
6
7=head1 NAME
8
9FindBin - Locate directory of original perl script
10
11=head1 SYNOPSIS
12
13 use FindBin;
14 use lib "$FindBin::Bin/../lib";
15
16 or
17
18 use FindBin qw($Bin);
19 use lib "$Bin/../lib";
20
21=head1 DESCRIPTION
22
23Locates the full path to the script bin directory to allow the use
24of paths relative to the bin directory.
25
26This allows a user to setup a directory tree for some software with
27directories C<< <root>/bin >> and C<< <root>/lib >>, and then the above
28example will allow the use of modules in the lib directory without knowing
29where the software tree is installed.
30
31If perl is invoked using the B<-e> option or the perl script is read from
32C<STDIN> then FindBin sets both C<$Bin> and C<$RealBin> to the current
33directory.
34
35=head1 EXPORTABLE VARIABLES
36
37 $Bin - path to bin directory from where script was invoked
38 $Script - basename of script from which perl was invoked
39 $RealBin - $Bin with all links resolved
40 $RealScript - $Script with all links resolved
41
42=head1 KNOWN ISSUES
43
44If there are two modules using C<FindBin> from different directories
45under the same interpreter, this won't work. Since C<FindBin> uses a
46C<BEGIN> block, it'll be executed only once, and only the first caller
47will get it right. This is a problem under mod_perl and other persistent
48Perl environments, where you shouldn't use this module. Which also means
49that you should avoid using C<FindBin> in modules that you plan to put
50on CPAN. To make sure that C<FindBin> will work is to call the C<again>
51function:
52
53 use FindBin;
54 FindBin::again(); # or FindBin->again;
55
56In former versions of FindBin there was no C<again> function. The
57workaround was to force the C<BEGIN> block to be executed again:
58
59 delete $INC{'FindBin.pm'};
60 require FindBin;
61
62=head1 KNOWN BUGS
63
64If perl is invoked as
65
66 perl filename
67
68and I<filename> does not have executable rights and a program called
69I<filename> exists in the users C<$ENV{PATH}> which satisfies both B<-x>
70and B<-T> then FindBin assumes that it was invoked via the
71C<$ENV{PATH}>.
72
73Workaround is to invoke perl as
74
75 perl ./filename
76
77=head1 AUTHORS
78
79FindBin is supported as part of the core perl distribution. Please send bug
80reports to E<lt>F<[email protected]>E<gt> using the perlbug program
81included with perl.
82
83Graham Barr E<lt>F<[email protected]>E<gt>
84Nick Ing-Simmons E<lt>F<[email protected]>E<gt>
85
86=head1 COPYRIGHT
87
88Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
89This program is free software; you can redistribute it and/or modify it
90under the same terms as Perl itself.
91
92=cut
93
94package FindBin;
95use Carp;
96require 5.000;
97require Exporter;
98use Cwd qw(getcwd cwd abs_path);
99use Config;
100use File::Basename;
101use File::Spec;
102
103@EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir);
104%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]);
105@ISA = qw(Exporter);
106
107$VERSION = "1.47";
108
109sub cwd2 {
110 my $cwd = getcwd();
111 # getcwd might fail if it hasn't access to the current directory.
112 # try harder.
113 defined $cwd or $cwd = cwd();
114 $cwd;
115}
116
117sub init
118{
119 *Dir = \$Bin;
120 *RealDir = \$RealBin;
121
122 if($0 eq '-e' || $0 eq '-')
123 {
124 # perl invoked with -e or script is on C<STDIN>
125 $Script = $RealScript = $0;
126 $Bin = $RealBin = cwd2();
127 }
128 else
129 {