Was ist $ () in einem Befehl?

18

Was ist $()in Linux-Shell-Befehlen?

Beispielsweise:

chmod 777 $(pwd)
Sudoer
quelle
1
Beachten Sie, dass es den Befehl line shell nicht gibt . Es gibt eine Reihe von Shell-Anwendungen für Linux.
Stéphane Chazelas

Antworten:

21

Es ist den Backticks `` sehr ähnlich.

Es heißt Befehlssubstitution ( Posix-Spezifikation ) und ruft eine Subshell auf. Der Befehl in Klammern $()oder zwischen den Backticks (``) wird in einer Subshell ausgeführt und die Ausgabe wird dann in den ursprünglichen Befehl eingefügt.

Im Gegensatz zu den Backticks kann das $(...)Formular verschachtelt werden. So können Sie die Befehlsersetzung in einer anderen Ersetzung verwenden.

Es gibt auch Unterschiede bei den maskierten Zeichen innerhalb der Substitution. Ich bevorzuge die $(...)Form.

Chaos
quelle
4
Backticks können auch verschachtelt werden. Beachten Sie, dass nachfolgende Zeilenumbrüche aus der Ausgabe des Befehls entfernt werden.
Stéphane Chazelas
2
@ StéphaneChazelas Wie können Backticks verschachtelt werden? Du meinst mit exzessiver Flucht?
Chaos
3
Ja, wie beiecho `echo \`echo foo\`` bar
Stéphane Chazelas
1
Gibt es eine offizielle Referenz, die besagt, dass Backticks veraltet sind?
Vinc17
1
Fanden diese Antwort: unix.stackexchange.com/questions/126927/… scheint, dass sie nicht veraltet sind. Meine Antwort wurde geändert, danke
Chaos
5

In POSIX oder POSIX artigen Schalen ( ksh, bash, ash, zsh, yash...), ist es wie ``: der Befehl im Innern $()wird durch die Standardausgabe ausgeführt und ersetzt werden . Das Aufteilen von Wörtern und das Generieren von Dateinamen werden durchgeführt, sofern sie nicht $()in doppelten Anführungszeichen stehen. Somit

chmod 777 $(pwd)

sollte ersetzt werden durch:

chmod 777 "$(pwd)"

um das Teilen von Wörtern und die Generierung von Dateinamen im aktuellen Arbeitsverzeichnis zu vermeiden.

Oder noch besser (außer unter einigen Shells, wie zsh, falls das Verzeichnis umbenannt wurde):

chmod 777 "$PWD"

Since $PWDist eine spezielle Variable, die den Pfad zum aktuellen Arbeitsverzeichnis in POSIX-Shells enthält.

Oder noch besser:

chmod 777 .

Da der .Eintrag im aktuellen Verzeichnis ein fester Link zu diesem Verzeichnis selbst ist.

vinc17
quelle
2

Dies $()wird zum Ausführen eines Befehls verwendet, der sich hauptsächlich in einem anderen Befehl befindet.

chmod 777 $(pwd)

pwdBefehl gibt das aktuelle Arbeitsverzeichnis an. Wenn also das Ganze ausgeführt wird, wird die Ausgabe von pwd seine Position ersetzen und als Argument dafür dienen chmod, und das Ergebnis ist, dass Ihr gesamtes aktuelles Arbeitsverzeichnis die Erlaubnis erhält, 777die ich denke, niemals in einer Produktionsumgebung verwendet werden sollte;).

Anfänger
quelle