Pfad des Perlinterpreters

Hallo

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.
Zunächst werde ich den als Konstante eintragen, aber schön ist das
nicht.

--
Schönen Gruß aus dem Bergischen Land und schönes Wochende
Robert
Robert Berghaus [ Sa, 07 Juli 2007 15:40 ] [ ID #1762513 ]

Re: Pfad des Perlinterpreters

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
Frank Wiegand [ Sa, 07 Juli 2007 16:12 ] [ ID #1762515 ]

Re: Pfad des Perlinterpreters

Frank Wiegand <frank [at] kcet.de> 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 <at> rezic <dot> 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
Slaven Rezic [ Sa, 07 Juli 2007 16:29 ] [ ID #1762516 ]

Re: Pfad des Perlinterpreters

On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> 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 [at] hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
hjp-usenet2 [ Sa, 07 Juli 2007 23:51 ] [ ID #1762520 ]

Re: Pfad des Perlinterpreters

Peter J. Holzer wrote:
> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> 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
Frank Seitz [ So, 08 Juli 2007 00:13 ] [ ID #1762521 ]

Re: Pfad des Perlinterpreters

Frank Wiegand schrieb:
> 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.

Danke, das funktioniert unter OS2 schonmal recht gut und wird es
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<argv[0]>.

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.,

[at] 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.


--
Schönen Gruß aus dem Bergischen Land
Robert
Robert Berghaus [ So, 08 Juli 2007 17:43 ] [ ID #1763001 ]

Re: Pfad des Perlinterpreters

Frank Seitz schrieb:
> Peter J. Holzer wrote:
>> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>>> Gibt es bei all den vielen internen Variablen auch eine, welche
>>> den kompletten Pfad des Interpreters enth=C3=A4lt?
>> 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.

Ich habe hier was =C3=A4hnliches (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=C3=A4re T:..., aber die EXE liegt wirklich in E:/Apps...
T: ist nur ein virtuelles Laufwerk, auf welches ich etliche Pfad
"mounte" (das nennt sich Toronto Virtual File System (TVFS) unter
OS2).

Vielen Dank, mit $^X sollte es gehen, ansonsten vervollst=C3=A4ndige
ich den Pfad noch mit dem Tip vom Slaven.
$EXECUTABLE_NAME geht hier =C3=BCbrigens nicht.

--
Sch=C3=B6nen Gru=C3=9F aus dem Bergischen Land
Robert
Robert Berghaus [ So, 08 Juli 2007 17:52 ] [ ID #1763002 ]

Re: Pfad des Perlinterpreters

On 2007-07-07 22:13, Frank Seitz <devnull4711 [at] web.de> wrote:
> Peter J. Holzer wrote:
>> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> 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 [at] hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
hjp-usenet2 [ Mo, 09 Juli 2007 21:59 ] [ ID #1763759 ]

Re: Pfad des Perlinterpreters

Peter J. Holzer wrote:
> On 2007-07-07 22:13, Frank Seitz <devnull4711 [at] web.de> 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
Frank Seitz [ Mo, 09 Juli 2007 22:23 ] [ ID #1763761 ]

Re: Pfad des Perlinterpreters

Peter J. Holzer schrieb:
> On 2007-07-07 22:13, Frank Seitz <devnull4711 [at] web.de> wrote:
>> Peter J. Holzer wrote:
>>> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>>>> Gibt es bei all den vielen internen Variablen auch eine, welche
>>>> den kompletten Pfad des Interpreters enth=C3=A4lt?
>>> 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=C3=B6rt 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=C3=A4ndlich ausgedr=C3=BCckt zu haben ;=
-)
Ich verstehe den Pfad einer Datei als die Stelle, wo die Datei *ist*.
Mein originales Posting ging =C3=BCbrigens noch weiter.

Hintergrund:
Wenn ich aus Programm A mit Win32::Process::Create Programm B
aufrufe, mu=C3=9F ich dem Create den Interpreter mit Pfad nennen.
Zun=C3=A4chst werde ich den als Konstante eintragen, aber sch=C3=B6n ist =
das
nicht.


--
Sch=C3=B6nen Gru=C3=9F aus dem Bergischen Land
Robert
Robert Berghaus [ Di, 10 Juli 2007 15:48 ] [ ID #1764840 ]

Re: Pfad des Perlinterpreters

On 2007-07-10 13:48, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
> Peter J. Holzer schrieb:
>> On 2007-07-07 22:13, Frank Seitz <devnull4711 [at] web.de> wrote:
>>> Peter J. Holzer wrote:
>>>> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> 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 [at] hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
hjp-usenet2 [ Di, 10 Juli 2007 23:48 ] [ ID #1764841 ]

Re: Pfad des Perlinterpreters

Peter J. Holzer schrieb:
> On 2007-07-10 13:48, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>> Peter J. Holzer schrieb:
>>> On 2007-07-07 22:13, Frank Seitz <devnull4711 [at] web.de> wrote:
>>>> Peter J. Holzer wrote:
>>>>> On 2007-07-07 13:40, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote=
:
>>>>>> Gibt es bei all den vielen internen Variablen auch eine, welche
>>>>>> den kompletten Pfad des Interpreters enth=C3=A4lt?
>>>>> 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=C3=B6rt 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=
=2E
>> Und ich hatte gedacht, mich verst=C3=A4ndlich ausgedr=C3=BCckt zu habe=
n ;-)
>> 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=C3=BCrlich dort l=C3=B6schen, 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=C3=B6nnte der User unter Umst=C3=A4nden ver=C3=A4ndern=
(sollte also
> eigentlich tainted sein - das habe ich jetzt nicht =C3=BCberpr=C3=BCft)=
=2E

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

--
Sch=C3=B6nen Gru=C3=9F aus dem Bergischen Land
Robert
Robert Berghaus [ Mi, 11 Juli 2007 15:08 ] [ ID #1767006 ]
Perl » de.comp.lang.perl.misc » Pfad des Perlinterpreters

Vorheriges Thema: Gruppe ding
Nächstes Thema: IPC::Open2, Windows: Eingabe-Umleitung tut nicht