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ührungsberechtigung mit hinzugefügt chmod
und sie kopiert /usr/bin
. Wenn ich es bei: nenne
proj
, macht es nichts. Was mache ich falsch?
pwd
in der letzten Zeile zu testen . Bevor das Skript fertig ist, können Sie überprüfen, ob es funktioniert oder nicht.cd
Befehl funktioniert gut in Skripten, versuchen Sie es selbst.cd
sich?Antworten:
Shell-Skripte werden in einer Subshell ausgeführt, und jede Subshell hat ein eigenes Konzept für das aktuelle Verzeichnis. Das ist
cd
erfolgreich, aber sobald die Subshell beendet wird, sind Sie wieder in der interaktiven Shell und dort hat sich nie etwas geändert.Eine Möglichkeit, dies zu umgehen, besteht darin, stattdessen einen Alias zu verwenden:
quelle
. my-script
odersource my-script
.Du machst nichts falsch! Sie haben das Verzeichnis geändert, jedoch nur innerhalb der Subshell, in der das Skript ausgeführt wird.
Sie können das Skript in Ihrem aktuellen Prozess mit dem Befehl "dot" ausführen:
Aber ich würde Gregs Vorschlag vorziehen, in diesem einfachen Fall einen Alias zu verwenden.
quelle
.
wird auch geschriebensource
, wählen Sie, was Sie unvergesslicher finden.Das
cd
in Ihrem Skript funktionierte technisch, da es das Verzeichnis der Shell änderte, in der das Skript ausgeführt wurde. Dies war jedoch ein separater Prozess, der von Ihrer interaktiven Shell getrennt wurde.Eine Posix-kompatible Möglichkeit, dieses Problem zu lösen, besteht darin, eine Shell-Prozedur anstelle eines von der Shell aufgerufenen Befehlsskripts zu definieren .
Sie können dies einfach eingeben oder in eine der verschiedenen Shell-Startdateien einfügen.
quelle
jhome(){ cd /home/tree/projects/$1; }
Das
cd
ist in dem Shell-Script. Wenn das Skript endet, wird diese Shell beendet und Sie bleiben in dem Verzeichnis, in dem Sie sich befanden. "Source" das Skript, führen Sie es nicht aus. Anstatt:tun
(Beachten Sie den Punkt und das Leerzeichen vor dem Skriptnamen.)
quelle
source
myscript.sh
es sich in einem Verzeichnis befindet, das in $ PATH enthalten ist, können Sie es von überall beziehen, ohne den vollständigen Pfad anzugeben.So erstellen Sie ein Bash-Skript, das in ein ausgewähltes Verzeichnis verschoben wird:
Erstellen Sie die Skriptdatei
Erstellen Sie dann einen Alias in Ihrer Startdatei.
Erstellen Sie beispielsweise eine Master-Aliase / Funktionsdatei: /scripts/mastercode.sh ( Fügen
Sie den Alias in diese Datei ein.)
Dann am Ende Ihrer .bashrc- Datei:
Jetzt ist es einfach, in Ihr Java-Verzeichnis zu cd. Geben Sie einfach cdjava ein und schon sind Sie da.
quelle
mastercode.sh
benötigt nicht shabang (#!/bin/sh
), da sie nicht in einer Subshell ausgeführt wird (und nicht ausgeführt werden kann). Gleichzeitig müssen Sie jedoch den Shell-Geschmack dieser Datei dokumentieren. zB ksh oder bash (oder (t) csh / zsh usw.), und es ist mit ziemlicher Sicherheit nicht wirklichsh
. Normalerweise füge ich einen Kommentar hinzu (aber nicht den Schebang), um dies zu kommunizieren. Beispiel: "Diese Datei soll (von Bash) bezogen und nicht als Shell-Skript ausgeführt werden."source
(überalias
) in Ihre Shell-Umgebung übertragen. Um dies zu vermeiden, erledigen Sie die gesamte Arbeit des Skripts in einer Funktion und rufen Sie es einfach am Ende des Skripts auf. Deklarieren Sie innerhalb der Funktion alle Variablenlocal
.Sie können
.
ein Skript in der aktuellen Shell-Umgebung ausführen:oder alternativ ist es besser lesbar, aber Shell-spezifischer Alias
source
:Dies vermeidet die Subshell und ermöglicht, dass Variablen oder integrierte Funktionen (einschließlich
cd
) stattdessen die aktuelle Shell beeinflussen.quelle
Jeremy Rutens Idee, einen Symlink zu verwenden, löste einen Gedanken aus, der keine andere Antwort gefunden hat. Verwenden:
Der führende Doppelpunkt ist wichtig; Dies bedeutet, dass, wenn sich im aktuellen Verzeichnis ein Verzeichnis 'dir' befindet, sich '' in dieses Verzeichnis
cd dir
ändert, anstatt woanders abzuspringen. Mit dem wie gezeigt eingestellten Wert können Sie Folgendes tun:und wenn es im aktuellen Verzeichnis kein Unterverzeichnis namens Java gibt, gelangen Sie direkt zu $ HOME / projects / java - keine Aliase, keine Skripte, keine zweifelhaften Execs oder Punktbefehle.
Mein $ HOME ist / Users / jleffler; Mein $ CDPATH ist:
quelle
Verwenden Sie
exec bash
am EndeDiese Frage wird jedoch häufig gestellt, weil man nach der Ausführung an einer (neuen) Bash-Eingabeaufforderung in einem bestimmten Verzeichnis bleiben möchte eines Bash-Skripts aus einem anderen Verzeichnis .
Wenn dies der Fall ist, führen Sie einfach eine untergeordnete Bash-Instanz am Ende des Skripts aus:
quelle
exit
, kehren Sie zu der Shell zurück, in der Sie dieses Skript ausgeführt haben.Ich habe meinen Code mithilfe von zum Laufen gebracht
. <your file name>
./<your file name>
funktioniert nicht, weil es Ihr Verzeichnis im Terminal nicht ändert, sondern nur das für dieses Skript spezifische Verzeichnis.Hier ist mein Programm
Hier ist mein Terminal
quelle
. something
und./something
? Diese Antwort hat bei mir funktioniert und ich verstehe nicht warum.. something
ermöglicht es Ihnen, das Skript von jedem Ort aus auszuführen,./something
erfordert , dass Sie sich in dem Verzeichnis befinden, in dem die Datei gespeichert ist.#!. /bin/bash
?einfach ausführen:
quelle
Wenn Sie ein Shell-Skript auslösen, wird eine neue Instanz dieser Shell (
/bin/bash
) ausgeführt. Ihr Skript startet also nur eine Shell, ändert das Verzeichnis und wird beendet. Anders ausgedrücktcd
(und andere solche Befehle) in einem Shell-Skript wirken sich nicht auf die Shell aus, von der aus sie gestartet wurden, und haben keinen Zugriff darauf.quelle
In meinem speziellen Fall brauchte ich zu oft, um für dasselbe Verzeichnis zu wechseln. Also habe ich auf meiner .bashrc (ich benutze Ubuntu) die hinzugefügt
1 -
2-
3 -
Direkt reicht es aus: cd / home / tree / projects / java
Ich hoffe, das hilft!
quelle
Sie können Folgendes tun:
BEARBEITEN: Dies könnte auch "gepunktet" werden, um die Erzeugung nachfolgender Schalen zu verhindern.
Beispiel:
quelle
exit
Beispiel mehrmals (oder Strg + d), um die Shell zu verlassen. Ein Alias ist so viel sauberer (selbst wenn der Shell-Befehl ein Verzeichnis ausgibt und es CDs gibt zur Ausgabe - Alias etwas = "cdgetnewdirectory.sh
")Es ändert nur das Verzeichnis für das Skript selbst, während Ihr aktuelles Verzeichnis gleich bleibt.
Möglicherweise möchten Sie stattdessen einen symbolischen Link verwenden. Sie können damit eine "Verknüpfung" zu einer Datei oder einem Verzeichnis erstellen, sodass Sie nur so etwas eingeben müssen
cd my-project
.quelle
Sie können die Alias- und Punktansätze von Adam & Greg kombinieren, um etwas zu erstellen, das dynamischer sein kann -
Wenn Sie jetzt den Projektalias ausführen, wird das Projektskript in der aktuellen Shell im Gegensatz zur Subshell ausgeführt.
quelle
Sie können einen Alias und ein Skript kombinieren.
vorausgesetzt, das Skript gibt den Zielpfad wieder. Beachten Sie, dass dies Backticks sind, die den Skriptnamen umgeben.
Zum Beispiel könnte Ihr Skript sein
Der Vorteil dieser Technik besteht darin, dass das Skript eine beliebige Anzahl von Befehlszeilenparametern verwenden und verschiedene Ziele ausgeben kann, die durch möglicherweise komplexe Logik berechnet werden.
quelle
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(oder,proj "foo bar"
<= falls Sie Leerzeichen haben) ... oder sogar (zum Beispiel):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> macht eincd
in/home/user/projects/java/a/b/c
Um schnell durch Verzeichnisse zu navigieren, gibt es $ CDPATH, cdargs und Möglichkeiten, Aliase automatisch zu generieren
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
quelle
In Ihrer ~ / .bash_profile-Datei. füge die nächste Funktion hinzu
Starten Sie das Terminal neu und Sie können eingeben
und Sie werden in den Zielordner verschoben.
quelle
Sie können den Operator && verwenden:
cd myDirectory && ls
quelle
&&
wenn der zweite von der ersten abhängig sein soll, oder nur mit;
oder mit einer neuen Zeile dazwischen). Wenn Sie dies jedoch in ein Skript einfügen, kehren Sie zu "Warum wird die übergeordnete Shell nicht verwendet?" Zurück das neue Verzeichnis, als dascd
tatsächlich erfolgreich war? "Während die Beschaffung des Skripts, das Sie ausführen möchten, eine Lösung darstellt, sollten Sie sich bewusst sein, dass dieses Skript die Umgebung Ihrer aktuellen Shell direkt ändern kann. Es ist auch nicht mehr möglich, Argumente zu übergeben.
Eine andere Möglichkeit besteht darin, Ihr Skript als Funktion in bash zu implementieren.
Diese Technik wird von Autojump verwendet: http://github.com/joelthelion/autojump/wiki , um Ihnen das Erlernen von Lesezeichen für Shell-Verzeichnisse bereitzustellen.
quelle
Sie können eine Funktion wie unten in Ihrem erstellen
.bash_profile
und sie funktioniert reibungslos.Die folgende Funktion verwendet einen optionalen Parameter, der ein Projekt ist. Zum Beispiel können Sie einfach ausführen
oder
Hier ist die Funktionsdefinition.
Vergessen Sie nicht, Ihre zu beschaffen
.bash_profile
quelle
Dies sollte tun, was Sie wollen. Wechseln Sie in das gewünschte Verzeichnis (aus dem Skript heraus) und erzeugen Sie dann eine neue Bash-Shell.
Wenn Sie dies ausführen, gelangen Sie zum gewünschten Verzeichnis. Wenn Sie es beenden, gelangen Sie zurück zum ursprünglichen Ort.
Dadurch kehren Sie beim Beenden von ( CTRL+ d) sogar zu Ihrem ursprünglichen Verzeichnis zurück.
quelle
LOOOOOng Zeit danach, aber ich habe folgendes getan:
Erstellen Sie eine Datei namens case
Fügen Sie Folgendes in die Datei ein:
Speichern Sie es und dann:
Ich habe auch einen Alias in meinem erstellt
.bashrc
:jetzt, wenn ich tippe:
Im Wesentlichen schreibe ich:
Sie können einen beliebigen Ordner nach 'case' eingeben:
Das ist wie Tippen:
beziehungsweise
In meinem Fall ist der Weg viel länger - diese Leute haben ihn früher mit den ~ Infos zusammengefasst.
quelle
cd
im Alias ist überflüssig und unelegant; der Alias sollte einfach '. ~ / case` stattdessen. Auchcase
ist ein reserviertes Schlüsselwort, also eine eher schlechte Wahl für einen Namen.Sie benötigen kein Skript, setzen nur die richtige Option und erstellen eine Umgebungsvariable.
in Ihren
~/.bashrc
erlaubt zucd
den Inhalt von Umgebungsvariablen.Erstellen Sie eine solche Umgebungsvariable:
und Sie können verwenden:
Andere Alternativen .
quelle
Wenn Sie Fisch als Schale verwenden, besteht die beste Lösung darin, eine Funktion zu erstellen. Bei der ursprünglichen Frage können Sie beispielsweise die folgenden 4 Zeilen kopieren und in Ihre Fischbefehlszeile einfügen:
Dadurch wird die Funktion erstellt und zur späteren Verwendung gespeichert. Wenn sich Ihr Projekt ändert, wiederholen Sie den Vorgang einfach über den neuen Pfad.
Wenn Sie möchten, können Sie die Funktionsdatei wie folgt manuell hinzufügen:
und geben Sie den Text ein:
und drücken Sie schließlich Strg + x, um den Vorgang zu beenden, und y, gefolgt von Zurück, um Ihre Änderungen zu speichern.
( HINWEIS: Bei der ersten Methode zur Verwendung von funcsave wird die Datei proj.fish für Sie erstellt. )
quelle
Ich habe ein einfaches Bash-Skript namens p, um das Ändern von Verzeichnissen auf
github.com/godzilla/bash-stuff zu verwalten. Legen Sie
das Skript einfach in Ihr lokales bin-Verzeichnis (/ usr / local / bin)
und legen Sie es ab
in Ihrem .bashrc
quelle
Beachten Sie die Diskussion Wie lege ich das Arbeitsverzeichnis des übergeordneten Prozesses fest?
Es enthält einige hackige Antworten, z. B. https://stackoverflow.com/a/2375174/755804 (Ändern des übergeordneten Prozessverzeichnisses über gdb, tun Sie dies nicht) und https://stackoverflow.com/a/51985735/755804 ( der Befehl
tailcd
, der cd dirname in den Eingabestream des übergeordneten Prozesses einfügt (im Idealfall sollte er eher ein Teil von bash als ein Hack sein).quelle
Es ist eine alte Frage, aber ich bin wirklich überrascht, dass ich diesen Trick hier nicht sehe
Anstatt CD zu verwenden , können Sie verwenden
Sie müssen keine Subshells erstellen oder Aliase verwenden.
Beachten Sie, dass es in Ihrer Verantwortung liegt, sicherzustellen, dass der / Pfad / Sie / wollen existiert.
quelle
Wie in den anderen Antworten erläutert, haben Sie das Verzeichnis geändert, jedoch nur innerhalb der Sub-Shell, in der das Skript ausgeführt wird . Dies hat keine Auswirkungen auf die übergeordnete Shell.
Eine Lösung besteht darin, Bash-Funktionen anstelle eines Bash-Skripts (
sh
) zu verwenden. indem Sie Ihren Bash-Skriptcode in eine Funktion einfügen. Dadurch wird die Funktion als Befehl verfügbar. Diese Funktion wird dann ohne untergeordneten Prozess ausgeführt, und daher wirkt sich jedercd
Befehl auf die Aufrufer-Shell aus.Bash-Funktionen:
Eine Funktion des Bash-Profils besteht darin, benutzerdefinierte Funktionen zu speichern, die im Terminal oder in Bash-Skripten ausgeführt werden können, genauso wie Sie Anwendungen / Befehle ausführen. Dies kann auch als Verknüpfung für lange Befehle verwendet werden.
Um Ihre Funktion effizient zu gestalten, müssen Sie Ihre Funktion am Ende mehrerer Dateien kopieren
Sie können
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
diese Dateien schnell bearbeiten / erstellenWie man :
Kopieren Sie Ihren Bash-Skriptcode in eine neue Funktion am Ende der Profildatei Ihrer Bash und starten Sie Ihr Terminal neu. Anschließend können Sie
cdd
die von Ihnen geschriebene Funktion ausführen .Skriptbeispiel
Verknüpfung zu
cd ..
mit erstellencdd
Es ist eine Abkürzung
Es ist eine Abkürzung
quelle
Sie können einige Zeilen in derselben Subshell ausführen, wenn Sie Zeilen mit Backslash beenden.
quelle