2010-09-24 5 views
10

Ich möchte einen Userland-Befehl implementieren, der eines seiner Argumente (Pfad) und ändern Sie das Verzeichnis zu diesem Verzeichnis. Nach dem Programmende möchte ich, dass die Shell in diesem Verzeichnis ist. Also ich möchte cd Befehl implementieren, aber mit externem Programm.Ändern Arbeitsverzeichnis in der Shell mit einem Python-Skript

Kann es in einem Python-Skript getan werden oder muss ich Bash Wrapper schreiben?

Beispiel:

[email protected]:/home/$>python cd.py tdi 
[email protected]:/home/tdi$> 

Antwort

14

Andere haben darauf hingewiesen, dass Sie das Arbeitsverzeichnis eines Elterns nicht von einem Kind ändern können.

Aber es gibt einen Weg, wie Sie Ihr Ziel erreichen können - wenn Sie von einer Shell-Funktion cd können das Arbeitsverzeichnis ändern. Fügen Sie diese zu Ihrer ~/.bashrc:

function go() 
{ 
    cd $(python /path/to/cd.py "$1") 
} 

Ihr Skript sollte den Pfad zu dem Verzeichnis drucken, die Sie ändern möchten. Zum Beispiel, das Ihr cd.py sein könnte:

#!/usr/bin/python 
import sys 
if sys.argv[1] == 'tdi': print '~/long/tedious/path/to/tdi' 
elif sys.argv[1] == 'xyz': print '~/long/tedious/path/to/xyz' 

Dann können Sie tun:

 
[email protected]:/home/$> go tdi 
[email protected]:/home/tdi$> go tdi 
+0

Dank, ich wollte nur darüber klar sein. – Darek

+1

Ich habe ein Skript geschrieben, das "cd {directory}" ausgibt, was ich mit '\' aufrufe./ change_dir \ '' (dh, führen Sie das Skript aus, aber umgeben Sie es mit Backticks). Dies bewirkt, dass der Interpreter ausführt, was auch immer das Programm auf stdout druckt. – Shadow

4

das nicht möglich sein wird.

Ihr Skript wird in einer Subshell ausgeführt, die von der übergeordneten Shell erzeugt wurde, in der der Befehl ausgegeben wurde.

Beliebige cd In der Sub-Shell vorgenommene Änderungen wirken sich nicht auf die Parent-Shell aus.

0

Wie das codaddict schreibt, beeinflusst das, was in Ihrer Sub-Shell passiert, nicht die Parent-Shell. Wenn Ihr Ziel jedoch der Benutzer mit einer Shell in einem anderen Verzeichnis ist, können Sie Python immer os.chdir verwenden, um das Arbeitsverzeichnis der Subshell zu ändern und dann eine neue Shell von Python zu starten. Dies ändert nicht das Arbeitsverzeichnis der ursprünglichen Shell, sondern belässt den Benutzer mit einem in einem anderen Verzeichnis.

1

cd sind ausschließlich als Shell-interner Befehl implementiert, weil jedes externes Programm nicht Elternteil ändern kann (?) Shells CWD.

-4

Ich werde versuchen, zu zeigen, wie man das Arbeitsverzeichnis eines Bash-Terminals auf einen beliebigen Pfad setzt, den ein Python-Programm auf recht einfache Weise haben will.

Nur Bash kann sein Arbeitsverzeichnis festlegen, daher werden Routinen für Python und Bash benötigt. Das Python-Programm hat eine Routine wie folgt definiert:

"Somefile" könnte für die Bequemlichkeit eine RAM-Disk-Datei sein. Bash "mount" würde tmpfs anzeigen, die irgendwo wie "/ run/user/1000" gemountet sind, also könnte eine Datei "/ run/user/1000/pythonwkdir" sein. "dd" ist der vollständige Verzeichnispfadname, der gewünscht wird.

Die Bash-Datei würde wie folgt aussehen:

#!/bin/bash 
#pysync ---Command ". pysync" will set bash dir to what Python recorded 
cd `cat /run/user/1000/pythonwkdr` 
+0

Ich habe deine Formatierung behoben, aber ernsthaft, du darfst wirklich nicht sehr hart versucht haben, es war ein völlig unverständliches Durcheinander. – Ajean

+0

Ajean, Danke. Du bist ein guter Sportler. Ich hoffe, der Beitrag wird einigen helfen. Aber nein, ich habe mich nicht sehr angestrengt. Ich mag keine Redakteure, die wissen, was Sie besser wollen als Sie. Ich schrieb einen einigermaßen gut eingerückten Post, aber der Redakteur vermasselte es ständig, weil ich keinen Schlüssel schlug. –

Verwandte Themen