it-swarm.com.de

Backtick verstehen (`)

Ich probiere den Befehl aus

$ b=5; echo `$b`;
-bash: 5: command not found

aber es druckt nicht 5, wie es soll. Was fehlt mir hier?

Was bedeutet `(backquote/backtick) in Befehlen? scheint zu sagen, dass ` wertet die darin enthaltenen Befehle aus und ersetzt sie durch die Ausgabe.

37
coolcric

Text zwischen Backticks wird ausgeführt und durch die Ausgabe des Befehls ersetzt (abzüglich der nachgestellten Zeilenumbrüche und beachten Sie, dass das Shell-Verhalten variiert, wenn die Ausgabe NUL-Zeichen enthält). Dies wird als Befehlssubstitution bezeichnet, da sie durch die Ausgabe des Befehls ersetzt wird. Wenn Sie also 5 drucken möchten, können Sie keine Backticks verwenden, Sie können Anführungszeichen wie echo "$b" Verwenden oder einfach ein beliebiges Zitat löschen und echo $b Verwenden.

Wie Sie sehen können, versucht [[= var] _, wenn $b 5 enthält, bei Verwendung von Backticks bash, den Befehl 5 Auszuführen, und da es keinen solchen Befehl gibt, schlägt dies mit einer Fehlermeldung fehl.

Versuchen Sie Folgendes auszuführen, um zu verstehen, wie Backticks funktionieren:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1 Sollte die erste Zeile der Datei /etc/passwd Drucken. Da wir jedoch Backticks verwenden, wird dies nicht auf der Konsole gedruckt. Stattdessen wird es in der Variablen A gespeichert. Sie können dies mit $A Wiedergeben. Beachten Sie, dass eine effizientere Methode zum Drucken der ersten Zeile die Verwendung des Befehls head -n1 /etc/passwd Ist. Ich wollte jedoch darauf hinweisen, dass der Ausdruck innerhalb von Backticks nicht einfach sein muss.

Wenn also die erste Zeile von/etc/passwd root:x:0:0:root:/root:/bin/bash Lautet, wird der erste Befehl dynamisch durch bash durch A="root:x:0:0:root:/root:/bin/bash" Ersetzt.

Beachten Sie, dass diese Syntax von der Bourne Shell stammt. Zitieren und Entkommen wird schnell zum Albtraum, besonders wenn Sie anfangen, sie zu verschachteln. Ksh hat die Alternative $(...) eingeführt, die jetzt standardisiert ist ( POSIX ) und von allen Shells unterstützt wird ( sogar die Bourne-Shell von Unix v9). Daher sollten Sie heutzutage stattdessen $(...) verwenden, es sei denn, Sie müssen auf sehr alte Bourne-Shells portierbar sein.

Beachten Sie auch, dass die Ausgabe von `...` Und $(...) genau wie die Variablenerweiterung (in zsh nur Word-Aufteilung) der Wortaufteilung und Dateinamengenerierung unterliegt und daher im Allgemeinen in der Liste angegeben werden muss Kontexte.

55

Der Backtick macht genau das, was Sie sagen. Sie haben eine Variable auf eine Ganzzahl gesetzt. Wenn Sie diese Variable in Backticks einfügen, versucht bash, sie als Befehl auszuführen. Da es sich nicht um einen Befehl handelt, wird der Fehler angezeigt, den Sie gesehen haben.

Was Sie tun möchten, ist einfach:

$ b=5; echo $b

Um Backticks besser zu verstehen, vergleichen Sie mit:

$ b=5; a=`echo $b`; echo $a
  5
11
terdon

Wenn Sie Schritt für Schritt vorgehen, sollte Ihre Linie dies erklären.

$ b=5; echo `$b`;
  1. setzt die Variable b auf 5
  2. bewertet $b (läuft effektiv 5)
  3. echoes die Ausgabe der obigen Auswertung.

Also ja, die Ausgabe, die Sie erhalten haben, wird erwartet. Sie bewerten den Inhalt einer Variablen und nicht den tatsächlichen Befehl, für den Sie sich gehalten haben. Alles, was Sie in Backticks einfügen, wird in einer neuen (Unter-) Shell simplay-ausgewertet (ausgeführt).

8
gertvdijk