Wie werden Klammern in der Befehlszeile interpretiert?

45

Beim Lesen des Einrichtungshandbuchs stieß grubich auf einen Artikel, in dem behauptet wurde, ich müsse eine der folgenden beiden Syntaxen verwenden:

echo \(hd0,0\) >> /boot/grub/grub.conf

oder

echo '(hd0,0)' >> /boot/grub/grub.conf

weil in der Befehlszeile Klammern auf besondere Weise interpretiert werden. Was ist das Besondere an den Klammern? Wie werden sie interpretiert?

Steve Brown
quelle

Antworten:

46

Klammern kennzeichnen eine Unterschale in Bash. So zitieren Sie die man bashSeite:

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

Dabei listist a nur eine normale Folge von Befehlen.

Dies ist eigentlich ziemlich portabel und nicht spezifisch für nur bash. Die Spezifikation POSIX Shell Command Language enthält die folgende Beschreibung für die (compound-list)Syntax:

Führen Sie die Verbundliste in einer Subshell-Umgebung aus. Siehe Shell-Ausführungsumgebung . Variablenzuweisungen und integrierte Befehle, die sich auf die Umgebung auswirken, bleiben nach Abschluss der Liste nicht wirksam.

jw013
quelle
In Bash und anderen Schalen ...?
Jasonwryan
3
Bash ist die, nach der ich gefragt habe ...
Steve Brown
5
Was ist der Unterschied zwischen $()und ()?
CMCDragonkai
5
@CMCDragonkai Das $()ist die Befehlsersetzung, das ()ist eine Subshell. Beide führen Befehle aus, der Unterschied ist, was mit der Ausgabe passiert. Die Namen sind viel einfacher zu suchen als die Symbole. Siehe auch unix.stackexchange.com/q/213530/9537
jw013
12

Eine in runde Klammern gesetzte Befehlsliste wird als Subshell ausgeführt.

Variablen in einer Subshell sind außerhalb des Codeblocks in der Subshell nicht sichtbar. Sie sind für den übergeordneten Prozess und die Shell, die die Subshell gestartet hat, nicht verfügbar. Dies sind im Grunde genommen lokale Variablen.

Siehe Linuxtopia - Kapitel 20. Subshells

Kennzeichen
quelle