2010-12-16 6 views

Antwort

11

Sie können nicht. Änderungen am aktuellen Verzeichnis wirken sich nur auf den aktuellen Prozess aus.

2

Ignacio ist richtig. Doch wie ein abscheuliches Hack (total schlecht beraten und dies sollte wirklich mich mindestens 10 nach unten Stimmen erhalten) können Sie eine neue Shell exec, wenn Sie mich

 
#!/bin/bash 
... 
cd/
exec bash 
+1

Ihre Anfrage für downvotes verdient Ihnen einen upvote –

+0

dies zu einem zusätzlichen Shell führt läuft (Ihr ursprüngliches). Bonuspunkte, wenn Sie das auch beheben können. – Sorpigal

+0

Ich mochte diese, obwohl Sie jetzt zweimal exit eingeben müssen, um das Terminalfenster zu schließen. Eine Verbesserung: exec bash -l (damit Ihre Eingabeaufforderung vernünftig ist) –

5

Lassen Sie erarbeiten ein wenig auf diese fertig sind:

Wenn Sie das Skript ausführen, erstellt bash einen neuen Prozess dafür, und Änderungen am aktuellen Verzeichnis wirken sich nur auf diesen Prozess aus.

Wenn Sie das Skript bereitstellen, wird das Skript direkt von der Shell ausgeführt, die Sie ausführen, ohne dass zusätzliche Prozesse erstellt werden. Änderungen am aktuellen Verzeichnis sind für Ihren Shell-Hauptprozess sichtbar.

So, wie Ignacio wies darauf hin, das kann nicht

0

getan werden Sie können eine Funktion definieren, die in dem aktuell Shell ausgeführt werden, dies zu unterstützen. Z.B.

md() { mkdir -p "$1" && cd "$1"; } 

Ich habe die oben in meiner ~/.bashrc

+1

Was hat das mit der Frage zu tun? – mob

+1

@mob Ermöglicht es Benutzern, eine schnelle Möglichkeit zum Ändern in ein bestimmtes/Variablenverzeichnis zu definieren, was wahrscheinlich die Absicht der Frage und der nachfolgenden Suchvorgänge war.+1 – BroSlow

1

Wenn Sie wirklich dieses Verhalten benötigen, können Sie Ihr Skript das Verzeichnis machen zurückzukehren, ist es dann irgendwie verwenden. Etwas wie:

#!/bin/bash 
cd /tmp 
echo $(pwd) 

und dann können Sie

cd $(./script.sh) 

hässlich, aber der Trick in diesem einfachen Fall.

+0

Ich stimme zu - wenn der Benutzer WIRKLICH benötigt dies und kann dies nicht über eine Funktion in. Bashrc Funktion erreichen, wäre die nächste Sache das externe Skript laufen und dann cd zu was auch immer die Rückkehr war - das bedeutet, dass das externe Skript nicht kann Interaktion mit dem Benutzer haben, da Sie die gesamte Ausgabe konsumieren. Deshalb scheint Williams Antwort ein wenig flexibler zu sein. mayEb stderr könnte verwendet werden - wirklich brauchen mehr Details vom Benutzer über den Anwendungsfall – nhed

1

Hier ist eine dumme Idee. Verwenden Sie PROMPT_COMMAND. Zum Beispiel:

 
$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE' 
$ export CDFILE=/tmp/cd.$$ 

Dann machen Sie die letzte Zeile des Skripts sein ‚pwd> $ CDFILE‘