2016-09-29 3 views
3

Bei dem Versuch, a question for another user, stieß ich auf etwas zu beantworten, die meine Neugier geweckt:Kann das Verzeichnis geändert werden und die Änderung bleibt bestehen, wenn das Skript beendet wird?

import os 
os.chdir('..') 

Wird das Arbeitsverzeichnis ändern, soweit Python betrifft, so, wenn ich in /home/username/, und ich laufe os.chdir('..'), jeden weiteren Code wird funktionieren, als ob ich in /home/ bin. Zum Beispiel, wenn ich dann tun:

import glob 
files = glob.glob('*.py') 

files wird eine Liste von .py Dateien in /home/ anstatt in /home/username/ sein. Sobald das Skript jedoch beendet wird, bin ich wieder in /home/username/ oder in dem Verzeichnis, aus dem ich das Skript ursprünglich ausgeführt habe.

Ich habe gefunden, das gleiche passiert mit Shell-Skripten. Wenn ich das folgende Skript:

#!/bin/bash 

cd /tmp 
touch foo.txt 

Ausführen des Skripts von /home/username/ wird eine Datei foo.txt in /tmp/ erstellen, aber wenn das Skript beendet, werde ich immer noch in /home/username/ nicht /tmp/ sein.

Ich bin gespannt, ob es ein Grund ist, warum das Arbeitsverzeichnis nicht geändert wird „permanent“ in diesen Fällen und wenn es ist ein Weg, um es dauerhaft zu ändern, zum Beispiel ein Skript mit ~$ python myscript.py zu laufen, und Lassen Sie das Terminal, von dem das Skript ausgeführt wurde, in einem anderen Verzeichnis enden, wenn das Skript beendet ist.

+2

Das setzt voraus, dass jeder Benutzer, der die Skripts ausführt, weiß, dass es ihr Shell-Verzeichnis am Ende ändern wird, andernfalls wird das Verhalten ziemlich, wenn nicht ein wenig erstaunlich sein. –

+0

@MosesKoledoye Ich habe das nicht berücksichtigt. Es wäre in der Tat sehr verwirrend und gefährlich, wenn der Benutzer nicht wüsste, was vor sich geht. Ich dachte an einen Fall, in dem der Benutzer das Verhalten wollte und erwartete. Vielleicht ist es Teil eines Workflows, in dem nach der Ausführung des Skripts etwas in der Shell, aber in einem anderen Verzeichnis ausgeführt werden muss, und das Skript speichert die Schritte, in denen es navigieren muss. – elethan

+0

Und ich glaube, Skripte sollten mehr wie Sandboxes in Bezug auf den Terminal/Arbeitsbereich sein, außer natürlich gibt es eine IO-Operation oder eine Ausnahme wird geworfen. Gute Frage tho; dachte * voll *. –

Antwort

1

Es gibt keine Möglichkeit dies zu tun, da der Aufruf von Python oder bash alles in ihrem eigenen Kontext ablaufen lässt (der endet, wenn das Skript endet).

Sie könnten diese Ergebnisse erreichen, indem Sie source verwenden, da dies Ihr (Shell-) Skript in der aktuellen Shell ausführen wird. Rufen Sie Ihr Beispielskript mit source foomaker.bash statt bash foomaker.bash

+0

Sehr interessant! Ich habe nicht realisiert, dass 'source' so funktioniert hat! Wenn also "source" das Skript in der aktuellen Shell ausführt, wo wird das Skript normal ausgeführt? – elethan

+2

Wenn Sie es mit 'bash foomaker.bash' aufrufen, wird es in einer Bash-Subshell ausgeführt. Im Grunde würde es nicht anders sein, als diese Befehle nacheinander auszuführen: 'bash' (öffne eine neue Bash-Shell) ->' cd foo' (CD innerhalb der Sub-Shell) -> 'exit' (zurück zur obersten Ebene) –

+0

Danke! Ja, ich habe gerade das gelesen: http://tldp.org/LDP/abs/html/subshells.html, das war hilfreich für mich. – elethan

Verwandte Themen