Welche Shell verwendet ein Aufruf von Perl system ()?

8

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?

    
Lazer 19.11.2010, 12:45
quelle

7 Antworten

17

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 .

    
mkb 19.11.2010, 14:03
quelle
4

Wenn Sie keine Shell aufrufen möchten, rufen Sie system mit einer Liste auf:

%Vor%

Wenn Sie eine bestimmte Shell wünschen, rufen Sie sie explizit auf:

%Vor%     
glenn jackman 19.11.2010 16:04
quelle
4

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%     
berekuk 19.11.2010 18:12
quelle
3

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%     
jim mcnamara 19.11.2010 12:51
quelle
2

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:

%Vor%

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.

    
Richard Corden 18.04.2012 17:31
quelle
1

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.

    
Joel Berger 20.11.2010 13:45
quelle
0

probiere system("echo $SHELL"); auf deinem System.

    
sud03r 19.11.2010 12:53
quelle

Tags und Links