Das Ersetzen von backtick durch $ () funktioniert nicht

17

Ich habe einige alte Skripte, die ich zu aktualisieren versuche. Ein Teil des Codes verdichtet sich zu:

 export X=`(echo "abc"; echo "def")`
 echo $X

was die erwartete Ausgabe ergibt:

 abc def

Jetzt sagt mir das Internet, dass Backticks raus sind, $()was ich verwenden muss, aber wenn ich versuche:

export X=$((echo "abc"; echo "def"))

X ist nicht gesetzt und ich bekomme die Fehlermeldung:

bash: echo "abc"; echo "def": syntax error: invalid arithmetic operator (error token is ""abc"; echo "def"")

Was mache ich falsch?

Harold
quelle

Antworten:

27

Die $(( … ))Syntax ist ein arithmetischer Ausdruck .

Was fehlt, ist ein Leerzeichen zwischen dem $(und dem Folgenden (, um die arithmetische Ausdruckssyntax zu umgehen.

Der Abschnitt zur Befehlsersetzung in der Spezifikation der Shell-Befehlssprache warnt tatsächlich davor:

If the command substitution consists of a single subshell, such as:

   $( (command) )

a conforming application shall separate the "`$(`" and '`(`' into two tokens
(that is, separate them with white space). This is required to avoid any
ambiguities with arithmetic expansion.
Timo
quelle
21
Es sollte beachtet werden, dass `...`und $(...)eine Unterschale trotzdem starten, so dass die inneren (...)nicht benötigt werden (einen Prozess verschwenden). Sie würden den Raum in Dingen wie $( (...); (...) )zum Beispiel (wo die inneren Unterschalen benötigt werden können) benötigen.
Stéphane Chazelas
15

Versuchen export X="$(echo "abc"; echo "def")"

JPG
quelle
Danke, das funktioniert, erfordert aber mehr Bearbeitung als die andere Lösung.
Harold
2
+1 für die Angabe der Anführungszeichen, die in den meisten POSIX-Shells erforderlich sind ( kshund bashdie einzigen Ausnahmen darstellen).
Stéphane Chazelas