827 Stimmen

Warum kann ich mit "cd" in einem Skript keine Verzeichnisse wechseln?

Ich versuche, ein kleines Skript zu schreiben, um das aktuelle Verzeichnis in mein Projektverzeichnis zu ändern:

#!/bin/bash
cd /home/tree/projects/java

Ich habe diese Datei als proj gespeichert, die Ausführungserlaubnis mit chmod und kopierte sie nach /usr/bin . Wenn ich sie anrufe: proj tut es nichts. Was mache ich falsch?

14 Stimmen

Seitenübergreifende Duplikate: superuser.com/questions/176783/

3 Stimmen

In Zukunft können Sie immer versuchen, es mit pwd in der letzten Zeile. Bevor das Skript beendet wird, können Sie also überprüfen, ob es funktioniert oder nicht.

6 Stimmen

@lesmana Wie kann das ein Duplikat sein?

58voto

Sagar Punkte 1263

Sie können verwenden . um ein Skript in der aktuellen Shell-Umgebung auszuführen:

. script_name

oder alternativ der besser lesbare, aber shellspezifische Alias source :

source script_name

Dies vermeidet die Subshell und erlaubt alle Variablen oder Builtins (einschließlich cd ), um stattdessen die aktuelle Shell zu beeinflussen.

40voto

Serge Stroobandt Punkte 23731

Utilisez exec bash am Ende

Ein Bash-Skript arbeitet mit seiner aktuellen Umgebung oder mit der Umgebung seines Kinder, aber niemals auf seine übergeordnete Umgebung.

Diese Frage wird jedoch oft gestellt, weil man sich nach der Ausführung an einer (neuen) Bash-Eingabeaufforderung in einem bestimmten Verzeichnis hinterlassen werden soll eines Bash-Skripts aus einem anderen Verzeichnis.

Wenn dies der Fall ist, genügt es eine untergeordnete Bash-Instanz ausführen am Ende des Skripts:

#!/usr/bin/env bash
cd /home/tree/projects/java
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
exec bash

Zur Rückkehr zum vorherigen, elterlichen bash Instanz, verwenden Sie Ctrl + D .

Update

Zumindest bei neueren Versionen von bash El exec in der letzten Zeile ist nicht mehr erforderlich. Außerdem kann das Skript mit jeder bevorzugten Shell arbeiten, indem man die $SHELL Umgebungsvariable. Dies ergibt dann:

#!/usr/bin/env bash
cd desired/directory
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL

40voto

Jonathan Leffler Punkte 694013

Jeremy Rutens Idee, einen Symlink zu verwenden, löste einen Gedanken aus, der mir bei keiner anderen Antwort gekommen ist. Verwenden:

CDPATH=:$HOME/projects

Der führende Doppelpunkt ist wichtig; er bedeutet, dass, wenn es ein Verzeichnis 'dir' im aktuellen Verzeichnis gibt, dann ' cd dir ' dazu übergehen wird, anstatt irgendwo anders hin zu springen. Wenn der Wert wie gezeigt eingestellt ist, können Sie das tun:

cd java

und wenn es im aktuellen Verzeichnis kein Unterverzeichnis namens java gibt, führt es Sie direkt zu $HOME/projects/java - keine Aliase, keine Skripte, keine dubiosen execs oder dot-Befehle.

Mein $HOME ist /Users/jleffler; mein $CDPATH ist:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

28voto

kaelhop Punkte 391

Ich habe meinen Code zum Funktionieren gebracht, indem ich . <your file name>

./<your file name> funktioniert nicht, weil es nicht das Verzeichnis im Terminal ändert, sondern nur das für das Skript spezifische Verzeichnis.

Hier ist mein Programm

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

Hier ist mein Terminal

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$

21voto

warhansen Punkte 676

Einfach laufen:

cd /home/xxx/yyy && command_you_want

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X