Perl-Skript, führen Sie „cd“ auf dem Terminal aus

Perl-Skript, führen Sie „cd“ auf dem Terminal aus

InSkript zum Ändern des aktuellen Verzeichnisses (cd, pwd) Es wird gezeigt, wie ein Bash-Skript ausgeführt wird, das das Terminalverzeichnis ändert.

Aber wie führe ich ein Perl-Skript aus, das ein Bash-Skript ausführt, das das Terminalverzeichnis ändert?

Antwort1

Das kannst du nicht.

Das Perl-Skript wird in einem Prozess ausgeführt, der ein Kindprozess Ihrer Shell-Sitzung ist. Dieser Kindprozess kann sein eigenes Arbeitsverzeichnis beliebig ändern, aber nicht das Arbeitsverzeichnis seines Elternprozesses. Wenn das Perl-Skript beendet wird, wird die Kontrolle an den Elternprozess (die Shell-Sitzung) zurückgegeben, der die ganze Zeit im selben Arbeitsverzeichnis geblieben ist, unabhängig davon, was der Kindprozess während seiner Ausführung getan hat.

Antwort2

Das kannst du nicht machendirektcd. Die einzige Möglichkeit für eine Shell, ihr aktuelles Verzeichnis zu ändern, besteht darin, dass die Shell selbst einen Befehl (oder pushd, popd, usw.) ausführt .

Sie können es aber auch indirekt tun. Hier ist ein einfaches Beispiel, das das aktuelle Verzeichnis ändert in /tmp:

cd-tmp.pl:

#!/usr/bin/perl

print "cd /tmp\n";

In Ihrem .bashrcoder .bash_profile:

cd-tmp() { eval $(cd-tmp.pl); }

Dies setzt voraus, dass cd-tmp.plsich dies in einem Verzeichnis in Ihrer Nähe befindet $PATH. Alternativ können Sie den vollständigen Pfad in der Funktion angeben.

Wenn Sie cd-tmpin Ihre Shell-Eingabeaufforderung tippen, wird aufgerufen cd-tmp.pl, die Ausgabe erfasst und diese Ausgabe als Shell-Befehl ausgeführt.

Ein Perl-Skript kann eine aufrufende Shell nicht dazu veranlassen, Verzeichnisse zu ändern, es kann ihr jedoch einen Befehl bereitstellen, den die Shell dann selbst ausführen kann.

Natürlich können Sie auch ein anderes Verzeichnis als verwenden /tmp, darunter eines, das anhand anderer Informationen ermittelt oder spontan erstellt wird.

Ein Punkt zur Klarstellung: Das aktuelle Verzeichnis ist eine Eigenschaft des aktuellen Shell-Prozesses, nicht des Terminals.

AKTUALISIEREN :

Mir ist gerade aufgefallen, dass ich einen Teil Ihrer Frage übersehen habe. Sie möchten „ein Perl-Skript, das ein Bash-Skript ausführt“. Es ist leicht genug, mein Beispiel dahingehend zu ändern, aber ich habe keine AhnungWarumSie benötigen das Perl-Skript, um ein Bash-Skript auszuführen. Sie haben uns bei weitem nicht genug darüber erzählt, was Sie eigentlich erreichen möchten.

Antwort3

Es gibt mehrere Möglichkeiten (ZEITSCHRIFT) der Ausführung externer Befehle aus Perl. Wie die Verwendung von exec(), die Verwendung von Backticks (``) usw. Wenn Sie die externen Befehle direkt aus Ihrem Perl-Skript ausführen können, besteht meiner Meinung nach keine Notwendigkeit, ein weiteres Bash-Skript aufzurufen (aber das können Sie auch tun). Folgen Sie dem unten stehenden Link, um mehr zu erfahren. Beachten Sie auch, dass alle im Programm vorgenommenen Änderungen nur die Untershell betreffen und nur im gesamten Programm wirksam bleiben, was immer gut ist, aber es gibt Möglichkeiten, die Änderungen dauerhaft zu machen, d. h. sie würden sich auch auf die übergeordnete Shell auswirken.

http://www.perlhowto.com/executing_external_commands

AKTUALISIEREN-

Einige Fragen zu „Wie man es auf andere Weise macht“. Für ungewöhnliche Anforderungen sollte es ungewöhnliche Lösungen geben (die funktionieren). Aber die Frage ist, warum Sie Perl verwenden würden, um das übergeordnete Shell-Verzeichnis zu ändern? So würden Sie es jedenfalls machen

$cat test.pl
 print "Hello world\n";
 print "cd ..";
$pwd
 /home/user/perlcode
$eval `perl test.pl|tee -a test.pl.log|grep cd`
$pwd
 /home/user

Antwort4

Eine weitere Lösung besteht darin, zuerst das Verzeichnis, das Sie besuchen möchten, in einer Zeichenfolgevariable zu speichern:
Beispiel:

$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);

verwandte Informationen