Was bedeutet "cd &"?

8

Ich weiß, wie man durch Eingabe das Verzeichnis vom Terminal wechselt

cd <directory>

Aber hier ist das Szenario. Ich habe Terminal verwendet, um in den Ordner meines Git-Repositorys zu wechseln.

  • glennRepositories
    • glenn-remdroid-repository

Angesichts der obigen Ordnerstruktur möchte ich einschalten, glenn-remdroid-repositoryda dies mein Repository ist.

cd glennRepositories

Bevor ich in das glenn-remdroid-repository wechselte, habe ich fälschlicherweise den Befehl eingegeben

cd & 

statt cd *. Ich habe verwendet, cd *weil der Ordnername für mich lang ist. Tut mir leid, dass ich faul bin.

Wenn ich das ausführe cd &, antwortet das Terminal

[1] 7519

Wenn ich dies ausführe, ist cd *dies jetzt geschehen

[1]+  Done                    cd  (wd: ~/glennRepositories)
(wd now: ~/glennRepositories/glenn-remdroid-repository)

Hat jemand was cd &bedeutet und seine Ausgabe? Google kennt meine Frage nicht :)

GLenn
quelle
1
Etwas, das mit Google nicht gefunden werden kann, ist ogooglebar , ein schwedischer Neologismus.
Chloe
Bei der Eingabe meiner Frage ging es im Suchergebnis um Compact Disk. Ungoogleable :)
GLenn
3
"Ich habe cd * verwendet, weil der Ordnername für mich lang ist. Tut mir leid, dass ich faul bin." Geben Sie einfach ein cd <TAB>und der Name des eindeutigen Ordners wird automatisch erweitert.
Bakuriu

Antworten:

20

Indem Sie das &am Ende der Befehlszeile schreiben , weisen Sie Ihre Shell an, die Befehlspipeline (in diesem Fall einen einzelnen Befehl) in einer Unter-Shell im Hintergrund auszuführen (ohne auf ein Ergebnis zu warten). cdist eine eingebaute Bash, aber das ist hier nicht wichtig. Es hat keinerlei Auswirkungen auf Ihre "übergeordnete" Shell, sodass Ihr Arbeitsverzeichnis nicht geändert wird.

[1] 7519

In dieser Zeile wird gemeldet, dass im Hintergrund ein Job mit der Nummer 1 ausgeführt wird und die Prozess-ID 7519 lautet. Ähnliches wird gedruckt, wenn Sie z. B. ausführen vimund dann Ctrl+ drücken Z, um ihn anzuhalten . Wenn der Vorgang abgeschlossen ist, meldet die Shell dies erst im nächsten Verarbeitungszyklus (z. B. Returnerneut drücken) und druckt dann die abgeschlossenen Aktualisierungsauftragsaufträge aus.

Für weitere Details lesen Sie bitte man bashden Abschnitt JOB CONTROL.

Als Referenz die Frage Warum funktioniert das exit &nicht? trägt eine gewisse Ähnlichkeit.

Miroslav Koškár
quelle
Ob das Auftragsende sofort oder bei der nächsten Eingabeaufforderung gemeldet wird, hängt von der Shell ab. In fishund zshwird sofort berichtet. In bashund anderen POSIX-Shells oder (t) csh hängt dies von der Einstellung der notifyOption ab (standardmäßig deaktiviert) ( zsheine POSIX-ähnliche Shell hat ebenfalls eine notifyOption, ist jedoch standardmäßig deaktiviert, es sei denn, sie wird angewiesen, eine andere Shell zu emulieren)
Stéphane Chazelas
1

Der &Bediener sendet einen Prozess an den Hintergrund. wie cdkann ohne Argumente ausgeführt werden Sie es laufen und es in den Hintergrund zu schicken. Wenn Sie die Manpage nehmen:

NAME

cd - Ändern Sie das Shell-Arbeitsverzeichnis.

ZUSAMMENFASSUNG

cd[ -L| -P] [ dir ]

BESCHREIBUNG

Ändern Sie das Shell-Arbeitsverzeichnis.

Ändern Sie das aktuelle Verzeichnis in DIR . Das Standard- DIR ist der Wert der HOMEShell-Variablen.

Die Variable CDPATHdefiniert den Suchpfad für das Verzeichnis, das DIR enthält . Alternative Verzeichnisnamen in CDPATHwerden durch einen Doppelpunkt (:) getrennt.
Ein Nullverzeichnisname entspricht dem aktuellen Verzeichnis. Wenn DIR mit einem Schrägstrich ( /) beginnt , CDPATHwird es nicht verwendet.

Wenn das Verzeichnis nicht gefunden wird und die Shell-Option festgelegt cdable_varsist, wird angenommen, dass das Wort ein Variablenname ist. Wenn diese Variable einen Wert hat, wird ihr Wert für DIR verwendet .

Optionen:

-LDas Befolgen symbolischer Links erzwingen die
-PVerwendung der physischen Verzeichnisstruktur, ohne symbolischen Links zu folgen

Standardmäßig folgen symbolische Links wie -Langegeben.

Beendigungsstatus:

Gibt 0 zurück, wenn das Verzeichnis geändert wird. sonst ungleich Null.

SIEHE AUCH

bash(1)

IMPLEMENTIERUNG

GNU Bash, Version 4.1.5 (1) -Veröffentlichung (i486-pc-linux-gnu)
Copyright (C) 2009 Freie Software Foundation, Inc.
Lizenz GPLv3 +: GNU GPL Version 3 oder höher

Sie können sehen, dass die Argumente optional sind. Damit

cd &wird als verarbeitet cdund dann in den Hintergrund gesendet. Wenn cdohne Argument aufgerufen wird, ist keine Verarbeitung erforderlich. Es geht also als "erledigt" (verarbeitet) in den Hintergrund.

Einige Informationen zu & The Bash &(kaufmännisches Und) sind ein integrierter Steuerungsoperator, der zum Verzweigen von Prozessen verwendet wird. Auf der Bash-Manpage heißt es: "Wenn ein Befehl vom Steuerungsoperator beendet wird &, führt die Shell den Befehl im Hintergrund in einer Subshell aus."

Wenn Sie in einer interaktiven Shell angemeldet sind, wird dem Prozess eine Auftragsnummer zugewiesen und die untergeordnete PID angezeigt. Die unten stehende Auftragsnummer ist eins.

bash$ sleep 30 &
[1] 3586

Beachten Sie, dass beim Verzweigen eines Prozesses die untergeordnete PID in der speziellen Variablen gespeichert wird $!

bash$ echo $!
3586

Sie können den Job anhand seiner Jobnummer wie folgt beenden:

bash$ jobs
[1]+ Running sleep 30 &
bash$ kill %1
[1]+ Terminated sleep 30
bash$
vfbsilva
quelle
5
Nah dran, aber nicht ganz. Zuerst wird es nicht cdausgeführt und dann in den Hintergrund gesendet. Der Hintergrundprozess wird tatsächlich erstellt, bevor das Programm im Fall eines regulären Befehls ausgeführt wird. Im Falle eines eingebauten wird dieses Verhalten emuliert. Der Befehl wird von diesem Hintergrundprozess ausgeführt und ersetzt ihn. Zweitens, cdohne Argumente tut etwas tun: es bringt Sie zu Ihrem HOMEVerzeichnis. Da Sie es jedoch in den Hintergrund verschoben haben, gibt es in diesem Fall keine Auswirkung.
Warren Young
@WarrenYoung von der Manpage heißt es, dass cd das Home-Verzeichnis übernimmt, wenn ihm kein Wert zugewiesen ist. Erhält es bei einem erfolgreichen Verzeichniswechsel nicht den Wert von $ pwd?
vfbsilva
1
Das aktuelle Arbeitsverzeichnis des Hintergrundprozesses ist betroffen, nicht das der Bash-Shell im Vordergrund.
Warren Young