Ich versuche, das Arbeitsverzeichnis meines Node.js-Skripts zu ändern, wenn es über ein bin-Skript ausgeführt wird. Ich habe so etwas wie folgendes:
#!/usr/bin/env node
process.chdir('/Users')
Wenn ich diese Datei dann mit ausführe ./bin/nodefile
, wird sie beendet, aber das Arbeitsverzeichnis des aktuellen Shell-Kontexts hat sich nicht geändert. Ich habe auch Shelljs ausprobiert , aber das funktioniert auch nicht.
Was ist der beste Weg, dies zu tun? Ich verstehe, dass es funktioniert, aber es ist nur in einem separaten Prozess.
javascript
node.js
terminal
command-line-interface
cd
Jonovono
quelle
quelle
Antworten:
Der richtige Weg, um Verzeichnisse zu ändern, ist tatsächlich mit
process.chdir(directory)
. Hier ist ein Beispiel aus der Dokumentation :Dies ist auch in der Node.js REPL testbar:
quelle
Es gibt keine integrierte Methode für Node, um die CWD der zugrunde liegenden Shell zu ändern, auf der der Node-Prozess ausgeführt wird.
Sie können das aktuelle Arbeitsverzeichnis des Knotenprozesses über den Befehl ändern
process.chdir()
.Wenn der Knotenprozess vorhanden ist, befinden Sie sich wieder in dem CWD, in dem Sie den Prozess gestartet haben.
quelle
Was Sie versuchen, ist nicht möglich. Der Grund dafür ist, dass in einem POSIX-System (Linux, OSX usw.) ein untergeordneter Prozess die Umgebung eines übergeordneten Prozesses nicht ändern kann. Dies umfasst das Ändern des Arbeitsverzeichnisses und der Umgebungsvariablen des übergeordneten Prozesses.
Wenn Sie sich in der Befehlszeile befinden und Ihr Knotenskript ausführen, erzeugt Ihr aktueller Prozess (
bash
,zsh
was auch immer) einen neuen Prozess mit einer eigenen Umgebung, normalerweise eine Kopie Ihrer aktuellen Umgebung (dies kann über Systemaufrufe geändert werden ; aber das würde den Rahmen dieser Antwort sprengen), so dass dieser Prozess alles, was er tun muss, vollständig isoliert ausführen kann. Wenn der Unterprozess beendet wird, wird die Kontrolle an den Prozess Ihrer Shell zurückgegeben, in dem die Umgebung nicht betroffen ist.Es gibt viele Gründe dafür, aber stellen Sie sich zum einen vor, Sie hätten ein Skript im Hintergrund (via
./foo.js &
) ausgeführt und während der Ausführung Ihr Arbeitsverzeichnis geändert oder Ihr überschriebenPATH
. Das wäre ein Albtraum.Wenn Sie einige Aktionen ausführen müssen, die das Ändern Ihres Arbeitsverzeichnisses Ihrer Shell erfordern, müssen Sie eine Funktion in Ihre Shell schreiben. Wenn Sie beispielsweise Bash ausführen, können Sie Folgendes in Folgendes einfügen
~/.bash_profile
:und dann ist diese coole Sache machbar:
Wenn Sie zusätzlich komplexere Aufgaben ausführen müssen, können Sie von dieser Funktion aus jederzeit Ihr NodeJS-Skript aufrufen.
Nur so können Sie das erreichen, was Sie versuchen.
quelle
Kurze Antwort: Nein (einfach?), Aber Sie können etwas tun, das Ihrem Zweck dient.
Ich habe ein ähnliches Tool ausgeführt (ein kleiner Befehl, der anhand einer Projektbeschreibung die Umgebung, Pfade, Verzeichnisse usw. festlegt). Was ich tue, ist alles einzurichten und dann eine Shell zu erzeugen mit:
Nach der Ausführung befinden Sie sich in einer Shell mit dem neuen Verzeichnis (und in meinem Fall der Umgebung). Natürlich können Sie die Bash für jede beliebige Shell ändern. Die Hauptunterschiede zu dem, wonach Sie ursprünglich gefragt haben, sind:
Für mich sind diese Unterschiede jedoch wünschenswert.
quelle