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?

696voto

Greg Hewgill Punkte 882617

Shell-Skripte werden innerhalb einer Subshell ausgeführt, und jede Subshell hat ihre eigene Vorstellung davon, was das aktuelle Verzeichnis ist. Die cd ist erfolgreich, aber sobald die Subshell beendet ist, befinden Sie sich wieder in der interaktiven Shell, in der sich nichts geändert hat.

Eine Möglichkeit, dies zu umgehen, besteht darin, stattdessen einen Alias zu verwenden:

alias proj="cd /home/tree/projects/java"

560voto

Adam Liss Punkte 46031

Sie machen nichts falsch! Sie haben das Verzeichnis gewechselt, aber nur innerhalb der Subshell, die das Skript ausführt.

Sie können das Skript in Ihrem aktuellen Prozess mit dem Befehl "dot" ausführen:

. proj

Aber ich würde Gregs Vorschlag vorziehen, in diesem einfachen Fall einen Alias zu verwenden.

233voto

DigitalRoss Punkte 138823

El cd in Ihrem Skript technisch gearbeitet da es das Verzeichnis der Shell änderte, die das Skript ausführte, aber das war ein separater Prozess, der von Ihrer interaktiven Shell abgezweigt wurde.

Eine Posix-kompatible Möglichkeit, dieses Problem zu lösen, ist die Definition einer Rohbauverfahren und nicht eine von der Shell hervorgerufene Befehlsskript .

jhome () {
  cd /home/tree/projects/java
}

Sie können dies einfach eintippen oder in eine der verschiedenen Shell-Startdateien eintragen.

180voto

Tzachi.e Punkte 1701

El cd wird in der Shell des Skripts durchgeführt. Wenn das Skript endet, wird die Shell beendet, und Sie befinden sich wieder in dem Verzeichnis, in dem Sie sich befunden haben. Geben Sie das Skript als "Quelle" ein, führen Sie es nicht aus. Anstelle von:

./myscript.sh

tun

. ./myscript.sh

(Beachten Sie den Punkt und das Leerzeichen vor dem Skriptnamen).

103voto

Matt Thomas Punkte 1387

Um ein Bash-Skript zu erstellen, das zu einem bestimmten Verzeichnis wechselt:

Erstellen Sie die Skriptdatei

#!/bin/sh
# file : /scripts/cdjava
#
cd /home/askgelal/projects/java

Erstellen Sie dann einen Alias in Ihrer Startdatei.

#!/bin/sh
# file /scripts/mastercode.sh
#
alias cdjava='. /scripts/cdjava'

  • Ich habe eine Startdatei erstellt, in der ich alle meine Aliase und benutzerdefinierten Funktionen ablege.
  • Dann füge ich diese Datei in meine .bashrc ein, damit sie bei jedem Start gesetzt ist.

Erstellen Sie zum Beispiel eine Master-Alias-/Funktionsdatei: /scripts/mastercode.sh
(Geben Sie den Alias in diese Datei ein.)

Am Ende Ihrer .bashrc Datei:

source /scripts/mastercode.sh

Jetzt ist es einfach, in Ihr Java-Verzeichnis zu wechseln, geben Sie einfach cdjava ein und Sie sind da.

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