Ich verwende einen Systemaufruf, um einige Aufgaben zu erledigen
%Vor%aber es klagt über fehlende Umgebungsvariablen. Diese Umgebungsvariablen werden auf meine Bash-Shell gesetzt (von wo aus ich den Perl-Code ausführe).
Was mache ich falsch?
Erstellt der Aufruf system
eine brandneue Shell (ohne Einstellungen für Umgebungsvariablen)? Wie kann ich das vermeiden?
Es ist kompliziert. Perl ruft nicht unbedingt eine Shell auf. Perldoc sagt:
Wenn nur ein Skalarargument vorhanden ist, wird das Argument auf Shell-Metazeichen überprüft, und falls vorhanden, wird das gesamte Argument an die Befehlshell des Systems zum Parsen übergeben (dies ist / bin / sh -c auf Unix-Plattformen). aber variiert auf anderen Plattformen). Wenn das Argument keine Shell-Metazeichen enthält, wird es in Wörter aufgeteilt und direkt an execvp übergeben, was effizienter ist.
Es sieht also so aus, als hätten Sie die Argumente direkt an execvp übergeben. Ob die Shell Ihre .bashrc-, .profile- oder .bash_profile-Datei geladen hat, hängt außerdem davon ab, ob die Shell interaktiv ist. Wahrscheinlich ist es nicht, aber Sie können wie dies überprüfen .
Wenn Sie keine Shell aufrufen möchten, rufen Sie system
mit einer Liste auf:
Wenn Sie eine bestimmte Shell wünschen, rufen Sie sie explizit auf:
%Vor%Ich denke, es ist nicht die Frage der Shell-Wahl, da Umgebungsvariablen immer von Unterprozessen geerbt werden, wenn sie nicht explizit bereinigt werden. Sind Sie sicher, dass Sie Ihre Variablen exportiert haben? Das wird funktionieren:
%Vor%Das wird auch funktionieren:
%Vor%Das würde nicht:
%Vor%system () ruft / bin / sh als Shell auf. Wenn Sie auf einer etwas anderen Box wie ARM sind, wäre es gut, die man-Seite für die exec-Familie von Anrufen zu lesen - Standardverhalten. Sie können Ihre .profile-Datei bei Bedarf aufrufen, da system () einen Befehl
übernimmt %Vor%Ich habe seit zwei Tagen damit zu kämpfen. In meinem Fall wurden Umgebungsvariablen korrekt unter Linux, aber nicht in Cygwin gesetzt.
Aus der Antwort von mkb dachte ich, dass ich man perlrun
checken könnte, und es erwähnt eine Variable namens PERL5SHELL
. Das folgende löste dann das Problem:
Wie so oft - ich kann nur sagen "es funktioniert für mich", obwohl die Dokumentation impliziert, dass dies eine vernünftige Lösung sein könnte:
Kann auf eine alternative Shell gesetzt werden, die perl intern zum Ausführen von "backtick" -Befehlen oder system () verwenden muss.
Wenn die von Perl verwendete Shell nicht implizit die Umgebungsvariablen erbt, werden sie nicht für Sie festgelegt.
Ich habe mit Umgebungsvariablen, die für mein Skript auf dieser Beitrag , wo ich die Umgebungsvariable $ DBUS_SESSION_BUS_ADDRESS setzen musste, aber das würde ich nicht tun, wenn ich das Skript root nannte. Sie können das durchlesen, aber am Ende können Sie überprüfen, ob% ENV Ihre benötigten Variablen enthält und wenn nicht, fügen Sie sie hinzu.
Von perlvar
%Vor%
Mein Problem war, dass ich das Skript unter sudo ausführte und nicht alle env-Variablen meines Benutzers beibehielt, führen Sie das Skript unter sudo aus oder wie ein anderer Benutzer, sagen wir www-data (apache)?
Einfacher Test:
%Vor%und wenn das nicht funktioniert, müssen Sie es zu% ENV oben in Ihrem Skript hinzufügen.