Ich möchte "env.sh" von "my_perl.pl" aufrufen, ohne eine Untershell zu fälschen. Ich habe versucht mit Backtics und System wie folgt - & gt; system (. env.sh)
[dot space env.sh], wird jedoch nicht funktionieren. Bitte hilf mir.
Untergeordnete Umgebungen können die übergeordneten Umgebungen nicht ändern. Am besten ist es, env.sh
aus dem Perl-Code zu analysieren und die Variablen in %ENV
:
Gegeben
%Vor%druckt
%Vor% Der Code kann nur einfache Dateien verarbeiten (z. B. behandelt er nicht if
-Anweisungen oder foo=$(date)
). Wenn Sie etwas komplizierteres brauchen, dann schreiben Sie einen Wrapper für Ihr Perl-Skript, das die Quelle env.sh
first ist der richtige Weg (es ist wahrscheinlich auch der richtige Weg, um an erster Stelle zu gehen).
Ein weiterer Grund, env.sh
vor dem Ausführen des Perl-Skripts zu beziehen, besteht darin, dass das Festlegen der Umgebungsvariablen in Perl für Module, die sie erwarten, zu spät erfolgt.
In der Datei foo
:
wo foo.real ist Ihr Perl-Skript.
Sie können beliebig komplexe Shell-Skripte verwenden, indem Sie sie mit der entsprechenden Shell ausführen, ihre Umgebung im selben Prozess auf Standardausgabe ausgeben und diese in Perl analysieren. Es ist ratsam, die Ausgabe in etwas anderes als% ENV zu leiten oder bestimmte Werte von Interesse zu filtern, damit Sie Dinge wie PATH nicht ändern, die an anderer Stelle interessante Nebenwirkungen haben könnten. Ich habe die Standardausgabe und den Standardfehler aus dem erzeugten Shellskript verworfen, obwohl sie in temporäre Dateien umgeleitet werden konnten und für die Diagnoseausgabe im Perlskript verwendet wurden.
foo.pl:
%Vor%foo.sh: Export BAR = baz
Versuchen Sie Folgendes (Unix-Codebeispiel):
cd / tmp
vi s
%Vor%vi t
%Vor%chmod 777 s t
./ t
Der erste Anruf von ENV lautet:
Der zweite ENV-Anruf lautet: test
Der Trick besteht darin, die exec zu verwenden, um zuerst Ihr bash-Skript zu erhalten und dann Ihr Perl-Skript erneut mit einem Argument aufzurufen, damit Sie wissen, dass Sie ein zweites Mal aufgerufen werden.