Warum funktioniert "cd" in einem Shell-Skript nicht?

766

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 chmodund sie kopiert /usr/bin. Wenn ich es bei: nenne proj, macht es nichts. Was mache ich falsch?

ashokgelal
quelle
10
Cross - Site - Duplikat: superuser.com/questions/176783/...
Lesmana
In Zukunft können Sie immer versuchen, es mit pwdin der letzten Zeile zu testen . Bevor das Skript fertig ist, können Sie überprüfen, ob es funktioniert oder nicht.
sobi3ch
5
@lesmana wie ist das ein Duplikat?
Aland
@aland Da OP das Skript tatsächlich nicht ausführt, ändert sich das Arbeitsverzeichnis für ihn nicht. cdBefehl funktioniert gut in Skripten, versuchen Sie es selbst.
Alexander Gonchiy

Antworten:

634

Shell-Skripte werden in einer Subshell ausgeführt, und jede Subshell hat ein eigenes Konzept für das aktuelle Verzeichnis. Das ist cderfolgreich, 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:

alias proj="cd /home/tree/projects/java"
Greg Hewgill
quelle
7
Aliase sind nicht so flexibel zu verwalten oder zu ändern. Bei vielen CDs könnten Skripte besser sein.
Thevs
16
Funktionen sind flexibler als Aliase, daher sollten Sie als Nächstes nachsehen, wenn Aliase nicht ausreichen.
Ephemient
4
Ist es erwähnenswert, dass unter MS-DOS das Verhalten von Skripten darin bestand, dass ein aufgerufenes Skript das Verzeichnis (und sogar das Laufwerk) der aufrufenden Befehlsshell ändern konnte? Und dass Unix diesen Defekt nicht hat?
Jonathan Leffler
23
Jonathan: Das stimmt zwar, aber es hängt nicht wirklich mit der Frage zusammen. Antworten auf SO würden doppelt so lang werden, wenn sie jeweils die entsprechenden Mängel in MS-DOS auflisten müssten!
Greg Hewgill
17
Eine andere Möglichkeit, dies zu umgehen, besteht darin, die Skriptdatei als Quelle zu verwenden: . my-scriptoder source my-script.
HelloGoodbye
503

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:

. proj

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

Adam Liss
quelle
95
.wird auch geschrieben source, wählen Sie, was Sie unvergesslicher finden.
Ephemient
47
@ Ephemient: Gute Punktequelle Das erklärt, warum es funktioniert. Quelle beweist auch, dass Faulheit - nicht Notwendigkeit - oft die Mutter der Erfindungsquelle ist
Adam Liss
8
@ephemient: Beachten Sie, dass die Quelle in C-Shell und Bash verwendet wird. Es wird weder in POSIX- oder Korn-Shells noch in klassischen Bourne-Shells unterstützt.
Jonathan Leffler
2
"Quelle" wird in Z-Shell verwendet
Nathan Moos
1
@AdamLiss Es funktioniert großartig, aber es gibt einen Nachteil: Irgendwie deaktiviert der Befehl source / dot die Möglichkeit, den Namen des Skripts / Befehls mit der TAB-Taste automatisch zu vervollständigen. Es ist weiterhin möglich, Argumente / Eingaben mit der TAB-Taste hinzuzufügen, aber leider muss der Name des Befehls direkt eingegeben werden. Wissen Sie, wie TAB-Schlüssel in diesem Fall funktionieren?
Rafal
215

Das cdin 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 .

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

Sie können dies einfach eingeben oder in eine der verschiedenen Shell-Startdateien einfügen.

DigitalRoss
quelle
6
Ich stimme zu, dies ist die beste Antwort. In einigen Situationen kann ein Alias ​​auch angemessen sein, aber wenn er versucht, eine CD in einem Skript zu verwenden und etwas anderes hinzufügen möchte, ist ein Alias ​​nutzlos.
Justin Buser
4
Das sieht nach einer Lösung aus! Und ich versuche es zu implementieren, aber es funktioniert nicht :( hier ist mein Skript: #! / Bin / bash jhome () {echo "bitte" cd / home echo "work"} jhome
Gant Laborde
1
@GantMan, sollten Sie dies in einer "Shell-Startdatei" hinzufügen, wie ~ / .bashrc
Jackie Yeh
3
Sie können auch ein Argument (oder zwei ...) verwenden, dh:jhome(){ cd /home/tree/projects/$1; }
irbanana
1
Dies sollte der richtige Weg sein, dies ermöglicht die Verwendung von Sonderzeichen wie "-".
Bangkokguy
159

Das cdist 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:

./myscript.sh

tun

. ./myscript.sh

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

Tzachi.e
quelle
2
Das ist cool und wahrscheinlich gut zu wissen. Was macht letzteres genau (wie funktioniert es)? Dies ist wahrscheinlich die beste Lösung für diesen Thread.
Jonah
2
fwiw, im Kommentarbereich von Adam Liss 'Antwort beantwortet Ephemient die Frage, was das'. ' ist. Es ist das gleiche wiesource
g19fanatic
1
Seien Sie vorsichtig, "Quelle" ist ein Bashismus. dh dash (Debian-Standard für / bin / sh) unterstützt es nicht, während "." funktioniert wie erwartet.
Allo
Gute Antwort! Auch wenn myscript.shes sich in einem Verzeichnis befindet, das in $ PATH enthalten ist, können Sie es von überall beziehen, ohne den vollständigen Pfad anzugeben.
CodeBrew
Das hat bei mir am besten funktioniert. Diese Lösung ist die einfachste (+1).
HuserB1989
96

So erstellen Sie ein Bash-Skript, das in ein ausgewähltes Verzeichnis verschoben wird:

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 speichere.
  • Dann quelle ich diese Datei in meine .bashrc, um sie bei jedem Start festzulegen.

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:

source /scripts/mastercode.sh



Jetzt ist es einfach, in Ihr Java-Verzeichnis zu cd. Geben Sie einfach cdjava ein und schon sind Sie da.

Matt Thomas
quelle
2
Die Datei mastercode.shbenö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 wirklich sh. 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."
Michael
Ein weiterer Tipp (für Bash): Wenn Sie Variablen in Ihrem Skript verwenden , werden diese Variablen während der Ausführung des Skripts source(über alias) 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 Variablen local.
Rhubbarb
In Ubuntu erstelle einfach ~ / .bash_aliases (falls es noch nicht existiert). Fügen Sie dort einfach Ihre Aliase hinzu, starten Sie das Terminal neu und fertig.
Vlad
51

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

. script_name

oder alternativ ist es besser lesbar, aber Shell-spezifischer Alias source:

source script_name

Dies vermeidet die Subshell und ermöglicht, dass Variablen oder integrierte Funktionen (einschließlich cd) stattdessen die aktuelle Shell beeinflussen.

Sagar
quelle
38

Jeremy Rutens Idee, einen Symlink zu verwenden, löste einen Gedanken aus, der keine andere Antwort gefunden hat. Verwenden:

CDPATH=:$HOME/projects

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:

cd java

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:

:/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
Jonathan Leffler
quelle
31

Verwenden Sie exec basham Ende

Ein Bash-Skript arbeitet in seiner aktuellen Umgebung oder in der seiner untergeordneten Umgebung, jedoch niemals in seiner übergeordneten Umgebung.

Diese 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:

#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash
Serge Stroobandt
quelle
16
Dadurch wird eine neue Unterschale erstellt. Wenn Sie eingeben exit, kehren Sie zu der Shell zurück, in der Sie dieses Skript ausgeführt haben.
Tripleee
1
Wenn das Skript mehrmals aufgerufen wurde, werden anscheinend verschachtelte Shells erstellt, und ich muss häufig "exit" eingeben. Könnte das irgendwie gelöst werden?
VladSavitsky
Siehe die anderen Antworten: Verwenden Sie einen Alias, verwenden Sie "pushd / popd / dirs" oder verwenden Sie "source"
qneill
25

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

#!/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$ 
kaelhop
quelle
2
Was ist der Unterschied zwischen . somethingund ./something? Diese Antwort hat bei mir funktioniert und ich verstehe nicht warum.
Dracorat
. somethingermöglicht es Ihnen, das Skript von jedem Ort aus auszuführen, ./somethingerfordert , dass Sie sich in dem Verzeichnis befinden, in dem die Datei gespeichert ist.
Projjol
Können Sie den Punkt in die Shebang-Linie setzen? #!. /bin/bash?
Sigfried
20

einfach ausführen:

cd /home/xxx/yyy && command_you_want
Warhansen
quelle
Dies funktionierte für mich danke @warhansen
Ashish Kumar
12

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ückt cd(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.

Daniel Spiewak
quelle
11

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 -

$ nano ~. / bashrc

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$ source ~ / .bashrc

3 -

$ switchp java

Direkt reicht es aus: cd / home / tree / projects / java

Ich hoffe, das hilft!

Arbeitsträumer
quelle
1
@WM Sie können schließlich "$ switchp" ohne Parameter ausführen, um direkt zum Projektbaum zu gelangen
Workdreamer
2
@workdreamer Der oben beschriebene Funktionsansatz löste hier ein kleines Problem beim Aufrufen von Unterordnern, die auf meinem System denselben übergeordneten Ordner haben. Vielen Dank.
WM
10

Sie können Folgendes tun:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

BEARBEITEN: Dies könnte auch "gepunktet" werden, um die Erzeugung nachfolgender Schalen zu verhindern.

Beispiel:

. ./previous_script  (with or without the first line)
Thevs
quelle
1
Das wird nach ein paar Läufen ziemlich chaotisch. Sie müssen zum exitBeispiel 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 = "cd getnewdirectory.sh")
dbr
Beachten Sie die 'exec'. Es ersetzt die alte Schale.
Thevs
2
Der Exec ersetzt nur die Sub-Shell, in der der Befehl cd ausgeführt wurde, nicht die Shell, in der das Skript ausgeführt wurde. Wenn Sie das Skript gepunktet hätten, wären Sie richtig.
Jonathan Leffler
Machen Sie es "gepunktet" - kein Problem. Ich habe gerade eine Lösung vorgeschlagen. Es hängt nicht davon ab, wie Sie dies starten.
Thevs
2
Hehe, ich denke, es ist besser, nur ein einzeiliges Skript mit nur einem CD-Befehl zu "punktieren" :) Ich werde meine Antwort trotzdem behalten ... Das wird die richtige dumme Antwort auf die falsche dumme Frage sein :)
Thevs
7

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.

Jeremy Ruten
quelle
Diesen Symlink in jedem Verzeichnis zu haben, wäre ein Ärgernis. Es wäre möglich, den Symlink in $ HOME zu setzen und dann 'cd ~ / my-project' zu machen. Ehrlich gesagt ist es jedoch einfacher, CDPATH zu verwenden.
Jonathan Leffler
7

Sie können die Alias- und Punktansätze von Adam & Greg kombinieren, um etwas zu erstellen, das dynamischer sein kann -

alias project=". project"

Wenn Sie jetzt den Projektalias ausführen, wird das Projektskript in der aktuellen Shell im Gegensatz zur Subshell ausgeführt.

robertmoggach
quelle
Dies ist genau das, was ich brauchte, um mein gesamtes Skript zu pflegen und es einfach von bash aus aufzurufen und die aktuelle Sitzung aufrechtzuerhalten - dies ist die PERFEKTE Antwort.
Matt The Ninja
7

Sie können einen Alias ​​und ein Skript kombinieren.

alias proj="cd \`/usr/bin/proj !*\`"

vorausgesetzt, das Skript gibt den Zielpfad wieder. Beachten Sie, dass dies Backticks sind, die den Skriptnamen umgeben. 

Zum Beispiel könnte Ihr Skript sein

#!/bin/bash
echo /home/askgelal/projects/java/$1

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.

JA Faucett
quelle
3
Warum? Sie könnten einfach verwenden: 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 ein cdin/home/user/projects/java/a/b/c
michael
5

In Ihrer ~ / .bash_profile-Datei. füge die nächste Funktion hinzu

move_me() {
    cd ~/path/to/dest
}

Starten Sie das Terminal neu und Sie können eingeben

move_me 

und Sie werden in den Zielordner verschoben.

mihai.ciorobea
quelle
3

Sie können den Operator && verwenden:

cd myDirectory && ls

Jack Bauer
quelle
Downvote: Dies versucht nicht, die eigentliche Frage hier zu beantworten. Sie können zwei Befehle an der Eingabeaufforderung ausführen (mit, &&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 das cdtatsächlich erfolgreich war? "
Tripleee
3

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.

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

Diese Technik wird von Autojump verwendet: http://github.com/joelthelion/autojump/wiki , um Ihnen das Erlernen von Lesezeichen für Shell-Verzeichnisse bereitzustellen.

thomasd
quelle
3

Sie können eine Funktion wie unten in Ihrem erstellen .bash_profileund sie funktioniert reibungslos.

Die folgende Funktion verwendet einen optionalen Parameter, der ein Projekt ist. Zum Beispiel können Sie einfach ausführen

cdproj

oder

cdproj project_name

Hier ist die Funktionsdefinition.

cdproj(){
    dir=/Users/yourname/projects
    if [ "$1" ]; then
      cd "${dir}/${1}"
    else
      cd "${dir}"
    fi
}

Vergessen Sie nicht, Ihre zu beschaffen .bash_profile

Krish
quelle
1
viel bessere Antwort als Alias
Pax0r
Diese Lösung zeichnet sich durch Einfachheit und Flexibilität aus.
Kjartan
3

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.

#!/bin/bash

# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash

Wenn Sie dies ausführen, gelangen Sie zum gewünschten Verzeichnis. Wenn Sie es beenden, gelangen Sie zurück zum ursprünglichen Ort.

root@intel-corei7-64:~# ./mov_dir.sh

root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#

Dadurch kehren Sie beim Beenden von ( CTRL+ d) sogar zu Ihrem ursprünglichen Verzeichnis zurück.

jithu83
quelle
3
Das Laichen einer neuen Bash bedeutet, dass Sie Ihre Geschichte verlieren und sie beginnt von vorne.
Tisch
2

LOOOOOng Zeit danach, aber ich habe folgendes getan:

Erstellen Sie eine Datei namens case

Fügen Sie Folgendes in die Datei ein:

#!/bin/sh

cd /home/"$1"

Speichern Sie es und dann:

chmod +x case

Ich habe auch einen Alias ​​in meinem erstellt .bashrc:

alias disk='cd /home/; . case'

jetzt, wenn ich tippe:

case 12345

Im Wesentlichen schreibe ich:

cd /home/12345

Sie können einen beliebigen Ordner nach 'case' eingeben:

case 12

case 15

case 17

Das ist wie Tippen:

cd /home/12

cd /home/15

cd /home/17

beziehungsweise

In meinem Fall ist der Weg viel länger - diese Leute haben ihn früher mit den ~ Infos zusammengefasst.

chris
quelle
1
Das cdim Alias ​​ist überflüssig und unelegant; der Alias ​​sollte einfach '. ~ / case` stattdessen. Auch caseist ein reserviertes Schlüsselwort, also eine eher schlechte Wahl für einen Namen.
Tripleee
1

Sie benötigen kein Skript, setzen nur die richtige Option und erstellen eine Umgebungsvariable.

shopt -s cdable_vars

in Ihren ~/.bashrcerlaubt zucd den Inhalt von Umgebungsvariablen.

Erstellen Sie eine solche Umgebungsvariable:

export myjava="/home/tree/projects/java"

und Sie können verwenden:

cd myjava

Andere Alternativen .

Gauthier
quelle
0

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:

function proj
   cd /home/tree/projects/java
end
funcsave proj

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:

nano ~/.config/fish/functions/proj.fish

und geben Sie den Text ein:

function proj
   cd /home/tree/projects/java
end

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. )

Lane Roathe
quelle
0

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

alias p='. p'

in Ihrem .bashrc

Godzilla
quelle
was macht das es sieht so aus, als würde es sich rekursiv selbst ausführen, obwohl ich mir sicher bin, wenn Sie es vorher ausgeführt haben;)
Ryan Taylor
0

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).

18446744073709551615
quelle
0

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

export PWD=the/path/you/want

Sie müssen keine Subshells erstellen oder Aliase verwenden.

Beachten Sie, dass es in Ihrer Verantwortung liegt, sicherzustellen, dass der / Pfad / Sie / wollen existiert.

Yuri Nudelman
quelle
Hat leider nicht funktioniert.
ttfreeman
0

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 jeder cdBefehl 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

/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile

Sie können sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profilediese Dateien schnell bearbeiten / erstellen

Wie 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 cdddie von Ihnen geschriebene Funktion ausführen .

Skriptbeispiel

Verknüpfung zu cd ..mit erstellencdd

cdd() {
  cd ..
}

Es ist eine Abkürzung

ll() {
  ls -l -h
}

Es ist eine Abkürzung

lll() {
  ls -l -h -a
}
Intika
quelle
-2

Sie können einige Zeilen in derselben Subshell ausführen, wenn Sie Zeilen mit Backslash beenden.

cd somedir; \
pwd
Max
quelle