Ich würde gerne wissen, ob es möglich ist, das aktuelle Terminalverzeichnis von dem ich mein Ruby-Skript ausführe zu ändern.
Wenn ich zum Beispiel das Skript von $HOME
im Terminal ausführe, möchte ich am Ende des Skripts in $HOME/mydir
cd.
Ich habe ein paar Dinge ausprobiert, aber ich finde immer im selben Verzeichnis, wo das Skript gestartet wurde.
Dinge, die ich versucht habe:
%Vor%Sie ändern tatsächlich das Verzeichnis, aber nur im Thread der Skriptausführung. Wenn das Skript beendet wird, ist meine aktuelle Position im Terminal immer noch die gleiche wie vor dem Starten des Skripts.
Ich habe etwas ähnliches in SO gefunden, aber es ist Python-bezogene und Antwort scheint negativ.
Sie können fragen warum?
Ich bin derzeit an einer Kommandozeilen-Anwendung beteiligt (mit gli
), die als Ausgangspunkt einen Projektordner benötigt. So sieht mein erster Befehl aus:
Erstellt einen neuen Ordner mit dem Namen project
im aktuellen Verzeichnis. Jetzt kann ich mit den anderen Befehlen arbeiten, die ich brauche:
Also war ich einfach und dachte, dass es nett wäre, mich in project
zu finden, nachdem myfoo new project
ausgeführt wurde.
Wie ich befürchtet habe, ist es nicht so einfach (überhaupt nicht möglich). Wie wäre es also mit einem Bash-Skript, das die Ruby-Aufrufe, die ich möchte, anstelle der von RubyGems generierten Standard-Datei verwendet? Ist das machbar? Bin ich dumm? Sollte ich eval
verwenden?
Danke für die Antworten. Aber ich habe Angst, dass niemand akzeptabel ist. Wahrscheinlich war die Frage nicht:).
Dies ist meines Wissens nicht möglich, da es sich um verschiedene Prozesse handelt. Wenn Sie den übergeordneten Prozess des Ruby-Skripts (Bash) beeinflussen müssen, muss Bash etwas bereitstellen. Sie könnten also Ihr Ruby-Skript einige Bash-Befehle ausgeben lassen und dann einen Bash-Wrapper haben, der die Ausgabe von Ruby ausgibt.
Versuchen Sie dies als Beispiel in Bash:
%Vor%Aber das wird nur funktionieren in Bash 4.0.
BEARBEITEN:
Tatsächlich können Sie dies mit eval anstelle von source in Bash 3 tun:
%Vor%Ich bezweifle, dass es einen einfachen Weg dafür gibt.
Wenn Sie ein Programm von Ihrer Login-Shell aus starten, führt es unter der Haube einen fork / exec aus, was bedeutet, dass ein neuer (untergeordneter) Prozess erstellt wird (der seine eigene Umgebung hat, zB das aktuelle Arbeitsverzeichnis) und seine Standardeingabe ist. Ausgabe- / Fehlerströme sind dem (übergeordneten) Shell-Prozess zugeordnet. Wenn Ihr Skript also Dir.chdir
aufruft, wird das aktuelle Arbeitsverzeichnis für den Skriptprozess (untergeordnet) und nicht das übergeordnete Element geändert.
Vielleicht könnte Ihr Skript vor dem Beenden eine neue Shell starten. Es sieht also so aus, als ob Ihr Terminal das Verzeichnis gewechselt hat. Allerdings müssten Sie diese zusätzliche Shell beenden, bevor Sie Ihre Terminalsitzung beenden ...
Vielleicht etwas leichter,
Sie können exec in Kombination mit Maerics post verwenden, um eine neue Bash-Shell innerhalb von Ruby zu erstellen, um dies zu erreichen.
%Vor% exec
ersetzt den übergeordneten Prozess (Shell) durch den untergeordneten Prozess (ruby), daher existiert die Shell nicht mehr (kein Beenden erforderlich).
Am Ende der Ruby-Routine wird Bash in dem neuen Verzeichnis (wieder mit exec
diesmal in Ruby) gefeuert und ersetzt den Ruby-Prozess.
Midnight Commander tut dies, indem er einen Shell-Alias und ein Wrapper-Skript verwendet.
Der Wrapper ist für das cd in ein Verzeichnis vorgesehen, das durch den Inhalt einer Datei bestimmt wird, die von mc (1) bei exit geschrieben wurde, und der Alias wird verwendet, um source
the wrapper auszuführen, wodurch er in der Login-Shell ausgeführt wird. anstelle der Subshell, die gespalten hätte, wäre das Skript normal gestartet worden.
Alles in allem kann damit das aktuelle Arbeitsverzeichnis beim Beenden geändert werden.
Um dies zu tun, müssten Sie die Alias- / Wrapper-Funktionalität duplizieren. Siehe Ссылка , wie sie es gemacht haben.
Tags und Links ruby