Pfad des Perlinterpreters

Pfad des Perlinterpreters

am 07.07.2007 15:40:19 von Robert Berghaus

Hallo

Gibt es bei all den vielen internen Variablen auch eine, welche=20
den kompletten Pfad des Interpreters enthält?

Hintergrund:
Wenn ich aus Programm A mit Win32::Process::Create Programm B=20
aufrufe, muß ich dem Create den Interpreter mit Pfad nennen.
Zunächst werde ich den als Konstante eintragen, aber schön ist das=20
nicht.

--=20
Schönen Gruß aus dem Bergischen Land und schönes Wochende
Robert

Re: Pfad des Perlinterpreters

am 07.07.2007 16:12:34 von Frank Wiegand

Robert Berghaus schrieb:
> Gibt es bei all den vielen internen Variablen auch eine, welche den
> kompletten Pfad des Interpreters enthält?

$^X (seit 5.6)

Siehe perlvar.


Grüße, Frank

Re: Pfad des Perlinterpreters

am 07.07.2007 16:29:09 von Slaven Rezic

Frank Wiegand writes:

> Robert Berghaus schrieb:
> > Gibt es bei all den vielen internen Variablen auch eine, welche den
> > kompletten Pfad des Interpreters enthält?
>
> $^X (seit 5.6)
>

Für den kompletten Pfad braucht man File::Spec->rel2abs($^X)

--
Slaven Rezic - slaven rezic de
BBBike - route planner for cyclists in Berlin
WWW version: http://www.bbbike.de
Perl/Tk version for Unix and Windows: http://bbbike.sourceforge.net

Re: Pfad des Perlinterpreters

am 07.07.2007 23:51:38 von hjp-usenet2

On 2007-07-07 13:40, Robert Berghaus wrote:
> Gibt es bei all den vielen internen Variablen auch eine, welche
> den kompletten Pfad des Interpreters enthält?
>
> Hintergrund:
> Wenn ich aus Programm A mit Win32::Process::Create Programm B
> aufrufe, muß ich dem Create den Interpreter mit Pfad nennen.

perl -MConfig -le 'print $Config{perlpath}'

hp


--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"

Re: Pfad des Perlinterpreters

am 08.07.2007 00:13:20 von Frank Seitz

Peter J. Holzer wrote:
> On 2007-07-07 13:40, Robert Berghaus wrote:
>>
>>Gibt es bei all den vielen internen Variablen auch eine, welche
>>den kompletten Pfad des Interpreters enthält?
>
> perl -MConfig -le 'print $Config{perlpath}'

$ perl -MConfig -le 'print $Config{perlpath}'
/usr/local/bin/perl
$ mv /usr/local/bin/perl /tmp
$ /tmp/perl -MConfig -le 'print $Config{perlpath}'
/usr/local/bin/perl

Ups.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Pfad des Perlinterpreters

am 08.07.2007 17:43:23 von Robert Berghaus

Frank Wiegand schrieb:
> Robert Berghaus schrieb:
>> Gibt es bei all den vielen internen Variablen auch eine, welche den=20
>> kompletten Pfad des Interpreters enthält?
>=20
> $^X (seit 5.6)
>=20
> Siehe perlvar.

Danke, das funktioniert unter OS2 schonmal recht gut und wird es=20
unter Win-XP wohl auch tun.

=3Ditem $EXECUTABLE_NAME

=3Ditem $^X

The name used to execute the current copy of Perl, from C's
C.

Depending on the host operating system, the value of $^X may be
a relative or absolute pathname of the perl program file, or may
be the string used to invoke perl but not the pathname of the
perl program file. Also, most operating systems permit invoking
programs that are not in the PATH environment variable, so there
is no guarantee that the value of $^X is in PATH. For VMS, the
value may or may not include a version number.

You usually can use the value of $^X to re-invoke an independent
copy of the same perl that is currently running, e.g.,

@first_run =3D `$^X -le "print int rand 100 for 1..100"`;

But recall that not all operating systems support forking or
capturing of the output of commands, so this complex statement
may not be portable.


Das ist genau das, was ich wollte.


--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Pfad des Perlinterpreters

am 08.07.2007 17:52:07 von Robert Berghaus

Frank Seitz schrieb:
> Peter J. Holzer wrote:
>> On 2007-07-07 13:40, Robert Berghaus wrote:
>>> Gibt es bei all den vielen internen Variablen auch eine, welche=20
>>> den kompletten Pfad des Interpreters enthält?
>> perl -MConfig -le 'print $Config{perlpath}'
>=20
> $ perl -MConfig -le 'print $Config{perlpath}'
> /usr/local/bin/perl
> $ mv /usr/local/bin/perl /tmp
> $ /tmp/perl -MConfig -le 'print $Config{perlpath}'
> /usr/local/bin/perl
>=20
> Ups.

Ich habe hier was ähnliches (unter OS2)
F:\home\robert\Changi>perl -MConfig -le "print $Config{perlpath};"
E:/Apps/Entwick/Perl-5.8/bin/perl

F:\home\robert\Changi>scanpath perl.exe
27: (2003-02-16 20:35:06 11.362 A---- T:\BinP\perl.exe)

F:\home\robert\Changi>perl -e "print $^X;"
T:/BinP/perl.exe

Richtig wäre T:..., aber die EXE liegt wirklich in E:/Apps...
T: ist nur ein virtuelles Laufwerk, auf welches ich etliche Pfad=20
"mounte" (das nennt sich Toronto Virtual File System (TVFS) unter=20
OS2).

Vielen Dank, mit $^X sollte es gehen, ansonsten vervollständige=20
ich den Pfad noch mit dem Tip vom Slaven.
$EXECUTABLE_NAME geht hier übrigens nicht.

--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Pfad des Perlinterpreters

am 09.07.2007 21:59:44 von hjp-usenet2

On 2007-07-07 22:13, Frank Seitz wrote:
> Peter J. Holzer wrote:
>> On 2007-07-07 13:40, Robert Berghaus wrote:
>>>Gibt es bei all den vielen internen Variablen auch eine, welche
>>>den kompletten Pfad des Interpreters enthält?
>>
>> perl -MConfig -le 'print $Config{perlpath}'
>
> $ perl -MConfig -le 'print $Config{perlpath}'
> /usr/local/bin/perl
> $ mv /usr/local/bin/perl /tmp
> $ /tmp/perl -MConfig -le 'print $Config{perlpath}'
> /usr/local/bin/perl
>
> Ups.

Nix "ups". Das gehört so.

$^X und $Config{perlpath} sind nicht das gleiche. Beides hat seine
Anwendungsgebiete, und es war der Frage des OP IMHO nicht zu entnehmen,
was er braucht. Daher habe ich die andere Variante ins Spiel gebracht.

hp

--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"

Re: Pfad des Perlinterpreters

am 09.07.2007 22:23:37 von Frank Seitz

Peter J. Holzer wrote:
> On 2007-07-07 22:13, Frank Seitz wrote:
>>
>>$ perl -MConfig -le 'print $Config{perlpath}'
>>/usr/local/bin/perl
>>$ mv /usr/local/bin/perl /tmp
>>$ /tmp/perl -MConfig -le 'print $Config{perlpath}'
>>/usr/local/bin/perl
>>
>>Ups.
>
> Nix "ups". Das gehört so.

Ich wollte darauf hinweisen, dass dieser Weg u.U. einen
unbrauchbaren Pfad liefert.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Pfad des Perlinterpreters

am 10.07.2007 15:48:36 von Robert Berghaus

Peter J. Holzer schrieb:
> On 2007-07-07 22:13, Frank Seitz wrote:
>> Peter J. Holzer wrote:
>>> On 2007-07-07 13:40, Robert Berghaus wrote:
>>>> Gibt es bei all den vielen internen Variablen auch eine, welche=20
>>>> den kompletten Pfad des Interpreters enthält?
>>> perl -MConfig -le 'print $Config{perlpath}'
>> $ perl -MConfig -le 'print $Config{perlpath}'
>> /usr/local/bin/perl
>> $ mv /usr/local/bin/perl /tmp
>> $ /tmp/perl -MConfig -le 'print $Config{perlpath}'
>> /usr/local/bin/perl
>>
>> Ups.
>=20
> Nix "ups". Das gehört so.
>=20
> $^X und $Config{perlpath} sind nicht das gleiche. Beides hat seine
> Anwendungsgebiete, und es war der Frage des OP IMHO nicht zu entnehmen,=

> was er braucht. Daher habe ich die andere Variante ins Spiel gebracht. =


Und ich hatte gedacht, mich verständlich ausgedrückt zu haben ;=
-)
Ich verstehe den Pfad einer Datei als die Stelle, wo die Datei *ist*.
Mein originales Posting ging übrigens noch weiter.

Hintergrund:
Wenn ich aus Programm A mit Win32::Process::Create Programm B=20
aufrufe, muß ich dem Create den Interpreter mit Pfad nennen.
Zunächst werde ich den als Konstante eintragen, aber schön ist =
das=20
nicht.


--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Pfad des Perlinterpreters

am 10.07.2007 23:48:04 von hjp-usenet2

On 2007-07-10 13:48, Robert Berghaus wrote:
> Peter J. Holzer schrieb:
>> On 2007-07-07 22:13, Frank Seitz wrote:
>>> Peter J. Holzer wrote:
>>>> On 2007-07-07 13:40, Robert Berghaus wrote:
>>>>> Gibt es bei all den vielen internen Variablen auch eine, welche
>>>>> den kompletten Pfad des Interpreters enthält?
>>>> perl -MConfig -le 'print $Config{perlpath}'
>>> $ perl -MConfig -le 'print $Config{perlpath}'
>>> /usr/local/bin/perl
>>> $ mv /usr/local/bin/perl /tmp
>>> $ /tmp/perl -MConfig -le 'print $Config{perlpath}'
>>> /usr/local/bin/perl
>>>
>>> Ups.
>>
>> Nix "ups". Das gehört so.
>>
>> $^X und $Config{perlpath} sind nicht das gleiche. Beides hat seine
>> Anwendungsgebiete, und es war der Frage des OP IMHO nicht zu entnehmen,
>> was er braucht. Daher habe ich die andere Variante ins Spiel gebracht.
>
> Und ich hatte gedacht, mich verständlich ausgedrückt zu haben ;-)
> Ich verstehe den Pfad einer Datei als die Stelle, wo die Datei *ist*.

Das ist allerdings bei $^X auch nicht garantiert. In argv[0] kann
beliebiger Murks stehen (zumindest unter Unix ist es nur Konvention,
dass da der Name oder Pfad des Executables drinsteht).

$Config{perlpath} hingegen ist der Pfad, wohin der Perl-Interpreter
installiert wurde. Man kann ihn natürlich dort löschen, aber man macht
sich damit seine ganze Perl-Installation kaputt (die Shebang-Zeilen
aller mittels Makemaker oder Module::Build installierten Scripts zeigen
ins Leere), also sollte man das besser nicht tun.

Bei Setuid-Scripts gibt es noch einen weiteren Grund $^X nicht zu
verwenden: Das könnte der User unter Umständen verändern (sollte also
eigentlich tainted sein - das habe ich jetzt nicht überprüft).

hp


--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"

Re: Pfad des Perlinterpreters

am 11.07.2007 15:08:11 von Robert Berghaus

Peter J. Holzer schrieb:
> On 2007-07-10 13:48, Robert Berghaus wrote:
>> Peter J. Holzer schrieb:
>>> On 2007-07-07 22:13, Frank Seitz wrote:
>>>> Peter J. Holzer wrote:
>>>>> On 2007-07-07 13:40, Robert Berghaus wrote=
:
>>>>>> Gibt es bei all den vielen internen Variablen auch eine, welche=20
>>>>>> den kompletten Pfad des Interpreters enthält?
>>>>> perl -MConfig -le 'print $Config{perlpath}'
>>>> $ perl -MConfig -le 'print $Config{perlpath}'
>>>> /usr/local/bin/perl
>>>> $ mv /usr/local/bin/perl /tmp
>>>> $ /tmp/perl -MConfig -le 'print $Config{perlpath}'
>>>> /usr/local/bin/perl
>>>>
>>>> Ups.
>>> Nix "ups". Das gehört so.
>>>
>>> $^X und $Config{perlpath} sind nicht das gleiche. Beides hat seine
>>> Anwendungsgebiete, und es war der Frage des OP IMHO nicht zu entnehme=
n,
>>> was er braucht. Daher habe ich die andere Variante ins Spiel gebracht=
.
>> Und ich hatte gedacht, mich verständlich ausgedrückt zu habe=
n ;-)
>> Ich verstehe den Pfad einer Datei als die Stelle, wo die Datei *ist*.
>=20
> Das ist allerdings bei $^X auch nicht garantiert. In argv[0] kann
> beliebiger Murks stehen (zumindest unter Unix ist es nur Konvention,
> dass da der Name oder Pfad des Executables drinsteht).
>=20
> $Config{perlpath} hingegen ist der Pfad, wohin der Perl-Interpreter
> installiert wurde. Man kann ihn natürlich dort löschen, aber =
man macht
> sich damit seine ganze Perl-Installation kaputt (die Shebang-Zeilen
> aller mittels Makemaker oder Module::Build installierten Scripts zeigen=

> ins Leere), also sollte man das besser nicht tun.
>=20
> Bei Setuid-Scripts gibt es noch einen weiteren Grund $^X nicht zu
> verwenden: Das könnte der User unter Umständen verändern=
(sollte also
> eigentlich tainted sein - das habe ich jetzt nicht überprüft)=


Für Programme, die in Windows oder OS2 laufen, funktioniert es=20
wohl, die Unterschiede zu Linux behalte ich mal im Hinterkopf.=20
$Config{perlpath} wird in der Umgebung auch funktionieren (ist=20
zumindest in config_heavy.pl (ActiveState Perl) richtig gesetzt).
argv[0] dürfte wohl aus dem Sourcecode des Interpreters sein. Es=20
ist auch bei DOS, Windows und OS2 Konvention, daß hier der=20
Programmname des Executables steht.

--=20
Schönen Gruß aus dem Bergischen Land
Robert