2016-04-14 9 views
2

Ich versuche, Perl zu verwenden, um einen Prozess zu erstellen, der Bash und dann eine Datei sample.txt erstellt, aber nach dem Bash-Befehl kann ich keine Ausgabe auf der Konsole oder sample.txt Datei in der gleichen Verzeichnisstruktur sehen. Kann mir jemand helfen, den folgenden Code zu reparieren?Können wir eine Bash-Instanz in Perl-Skript erstellen?

my $var = `bash -l`; 
system($var); 
print "Done!"; 

my $filename = 'sample.txt'; 
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!"; 
chmod(0777, "sample.txt"); 
print $fh "hello"; 
close $fh; 
print "Done 1!.."; 
+0

Wollten Sie schreiben: 'my $ var =" bash -l ";' damit das 'system'' bash -l' ausführt, anstatt die Ausgabe von 'bash -l'? Wie es aussieht, führen Sie das 'bash -l' als einen Befehl mit Perl aus, der die Ausgabe erfasst (so dass Sie es nie auf dem Bildschirm sehen werden). –

+0

Nein.Das ist, was ich meine $ var = 'bash -l 'schreiben möchte; Aber hier ist die Frage, warum ich keine Ausgabe sehen kann? Und was, wenn ich sehen will? Irgendwelche Vorschläge. – Yog

+1

Sie meinen, Sie wollen wirklich '' my $ var = 'bash -l';' 'was bedeutet, dass Sie die Ausgabe von der Login-Shell nicht sehen, bis die' system'-Anweisung versucht, die Eingabeaufforderungen usw. als Befehle auszuführen? Ich denke du bist verwirrt. –

Antwort

3

Bash -l Argument überzeugt es interaktiv zu bleiben. Laufen:

perl -e 'print `bash -l`' 

Auf seiner eigenen hat die Bash-Prozess interaktiv stdin gebunden, aber der Ausgang des subprocess wird durch perl erfasst und ausgedruckt später, wenn bash beendet wird, die es nur tun, wenn Sie SteuerD drücken , Ausgabe 10 oder logout usw.

Sie wollten wahrscheinlich mit $var = 'bash -l'; beginnen. Das wird zuerst interaktiv starten, und wenn Sie beenden, wird der Rest des Programms fortgesetzt. Für mich ist es ungewöhnlich zu wollen dies zu tun, und ich erwarte, dass Sie etwas für Bash schreiben sollten, die normalerweise mit dem -c Argument normalerweise beendet.

Ersetzen Sie Ihre ersten beiden Zeilen Code mit:

system("bash", "-c", "echo Hello World!"); 

erreicht dies, und der Rest des Programms führt normalerweise. Ich bin mir nicht sicher, was Sie aber für Sie tun wollten. Diese Beispielfälle würden mit nur
system("echo", "Hello World!") oder print "Hello World!" besser erreicht werden.

+0

Ändern der Zuordnung zu 'my $ var =" bash -l ";' (einfache oder doppelte Anführungszeichen funktionieren in diesem Kontext gleich) lass es richtig funktionieren. Die "System" -Funktion führt den Prozess mit Standardeingabe, -ausgabe und -fehlern aus, die alle mit Perls Standardkanälen verbunden sind, und die Shell funktioniert sinnvoll als eine interaktive Shell. –

+0

@ JonathanLeffler richtig; Ich werde das in meiner Antwort aktualisieren; Ich stolperte durch die visuelle Ähnlichkeit zu diesem aufregenden aber die Prozesse abgehängt hängend im Hintergrund, was nicht der Fall ist. – dlamblin

+0

danke für die Antwort ... Kann ich dieses System schreiben ("bash - l", "-c", "echo Hallo Welt!"); – Yog

Verwandte Themen