Reemplazar backtick con $ () no funciona

17

Tengo algunos scripts antiguos que intento actualizar. Parte del código se condensa a:

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

que da el resultado esperado:

 abc def

Ahora, Internet me dice que los backticks están fuera $()es lo que necesito usar, pero cuando lo intento:

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

X no está configurado y me sale el error:

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

¿Qué estoy haciendo mal?

Harold
fuente

Respuestas:

27

La $(( … ))sintaxis es una expresión aritmética .

Lo que falta es un espacio entre el $(y el siguiente (, para evitar la sintaxis de la expresión aritmética.

La sección sobre sustitución de comandos en la especificación del lenguaje de comandos de shell en realidad advierte que:

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
fuente
21
Debe tenerse en cuenta que `...`e $(...)iniciar una subshell de todos modos, por lo que (...)no son necesarios los internos (desperdiciar un proceso) Necesitaría el espacio en cosas como, $( (...); (...) )por ejemplo (donde las subcapas internas pueden ser necesarias).
Stéphane Chazelas
15

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

JPG
fuente
Gracias, esto funciona, pero requiere más edición que la otra solución.
Harold
2
+1 para incluir las comillas necesarias en la mayoría de los shells POSIX ( kshy bashser las únicas excepciones).
Stéphane Chazelas