Was ist der Zweck von cd `(backtick)?

57

Das Folgende verhält sich in Fedora und CentOS gleich.

cd mydirectory

funktioniert.

cd notadirectory

funktioniert (bekommt einen Fehler von Bash).

Jedoch,

cd `

gibt mir eine Art Aufforderung:

>

Nichts, woran ich gedacht habe, gibt eine Antwort, es geht nur zur nächsten Zeile, um erneut eine Aufforderung zu geben. Ich benutze einfach CTRL+ C, um zu meinem zurückzukehren root@localhost.

Was ist der Zweck davon und was kann man damit machen?

Vielen Dank!

Mooseman
quelle
6
Ihre Frage >bezieht sich also mehr auf das als auf das Backtick, da dies auch in anderen Situationen vorkommen kann
Tobias Kienzler,

Antworten:

124

Was Sie eingegeben haben, ist ein Backtick. Dies ist der Beginn einer Anweisung, mit der die Bewertung Ihrer Eingabe als Befehl ausgelöst wird. Das >wird angezeigt, um anzuzeigen, dass Sie den Befehl in der nächsten Zeile noch eingeben.

Wenn Sie das Backtick schließen, wird der gesamte Befehl ausgeführt. Z.B

~$ cd `
> echo /var`
/var$
John C
quelle
17
Sie können sie sogar nisten. Ein etwas realistisches Beispiel: cd `dirname \`which ls\``= cd in das Verzeichnis, in dem sich die Binärdatei "ls" befindet. (dh cd /binda es ist /bin/ls) [Bearbeiten: Puh, es ist hart, diesen Abschlag zu entkommen]
MSalters
54
@MSalters Sie haben stolperte vielleicht auf den Grund , warum moderne bash bevorzugt $()zu ``. Ihr Beispiel (plus das richtige Zitat) würde cd "$(dirname "$(which ls)")"viel weniger verrückt werden.
Muzer
31
@Muzer Es ist nicht nur bash , die es vorzieht, aber es ist in der POSIX - Spezifikation empfohlen verwenden $()einfache Anführungszeichen über.
Seestern
59

Die Antwort von JohnC erklärt bereits das Backtick. Aber worüber Sie sich auch wundern, ist die >Aufforderung. Dies ist eine Fortsetzungsaufforderung und wird nicht nur durch ein Backtick ausgelöst, sondern immer dann, wenn Ihre Shell eindeutig weiß, dass Sie noch keinen Befehl eingegeben haben . Am einfachsten ist es, eine explizite Zeilenfortsetzung \am Ende einer Eingabezeile einzufügen (dies hilft, lange Eingaben aufzuteilen):

$ echo \
> hallo

Beachten Sie, dass Sie wie bei den PS1Steuerelementen für das Erscheinungsbild der Eingabeaufforderung auch festlegen können PS2, dass die Fortsetzung der Eingabeaufforderung geändert werden soll, z

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

Es gibt viele Gründe für die Fortsetzung. Ein einzelner Backtick ist unvollständig, aber Sie können auch so etwas eingeben

ls -l `which cp`

in einer einzigen Zeile (Randnotiz: Es wird empfohlen, stattdessen $(und zu )verwenden, da die Klammern deutlich machen, wo die Erweiterung beginnt und endet, während einzelne Backticks es schwieriger machen, zu erkennen, wo sie fehlen. Und verschachteln ...). Andere mögliche Gründe für eine Fortsetzung der Aufforderung:

  • ein fehlt donenach whileoderfor
  • ein Vermisster finach einemif
  • ein esacnachher fehltcase
  • eine fehlende schließende Klammer, zB in Unterschalen (cd $HOME; cat .bashrc)
  • ein fehlender Befehl nach der Weiterleitung |sowie eine bedingte Ausführung ||und &&(nicht &jedoch, da der Befehl nur im Hintergrund ausgeführt wird)
  • ein fehlendes Schlusszitat ( 'oder ")

Seltsamerweise führt eine fehlende geschweifte Klammer }nach einer variablen Erweiterung ${auch zu einer Fortführungsaufforderung, die jedoch aufgrund des eingegebenen Leerzeichens fehlschlägt:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
quelle
2
Und das gleiche passiert, wenn Anführungszeichen verwendet werden :)
Steen Schütt
1
Ich kannte die Antwort auf diese Frage bereits, als ich sie in der Seitenleiste sah, aber ich wollte Ihnen eine zusätzliche, wenn auch imaginäre +1 für eine sehr schöne ausführliche Antwort geben. Diese Art von Inhalten macht die StackExchange-Sites großartig. Also ... Danke und weiterhin großartig.
Unkwntech
4

Dies bedeutet, dass Ihr Befehl noch nicht vollständig ist. Tatsächlich wird das Zeichen-Backtick, `verwendet, um einen Inline-Befehl abzugrenzen.

Beispiel:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory
Slyx
quelle
0

Der Backtick startet / beendet die Befehlsersetzung. Die Shell liest den Befehl in den Backticks, interpretiert die Ergebnisse und fügt sie in den Befehl ein. Z.B:. ls which cpführt dazu, dass "which cp" ausgeführt wird und das Ergebnis dieses Befehls, dh / bin / cp, als Argument für den Befehl ls verwendet wird. Dieses Verhalten wird jedoch zugunsten der expliziteren und lesbareren $ (cmd) -Befehlsersetzung nicht mehr empfohlen.

Bei der Eingabe von cd `Die Shell erwartet, dass ein Befehl ausgeführt wird, der folgt und mit einem Backtick abgeschlossen wird.

Bei der variablen Erweiterung mit geschweiften Klammern zeigt die Shell die Eingabeaufforderung für die Fortsetzung an, da diese Klammern vor der Erweiterung lexikalisch ausgewertet werden.

Nicole Stevens
quelle