a substituição do backtick por $ () não está funcionando

17

Eu tenho alguns scripts antigos que tento atualizar. Alguns dos códigos condensa para:

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

que fornece a saída esperada:

 abc def

Agora, a internet me diz que os backticks estão fora $()é o que eu preciso usar, mas quando tento:

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

X não está definido e recebo o erro:

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

O que estou fazendo de errado?

Harold
fonte

Respostas:

27

A $(( … ))sintaxe é uma expressão aritmética .

O que está faltando é um espaço entre o $(e o seguinte (, para evitar a sintaxe da expressão aritmética.

A seção sobre substituição de comando na especificação da linguagem de comando do shell realmente alerta para isso:

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
fonte
21
Deve-se notar que `...`e $(...)iniciar um subshell de qualquer maneira, para que o interior (...)não seja necessário (desperdice um processo). Você precisaria do espaço em coisas como, $( (...); (...) )por exemplo (onde os subshells internos podem ser necessários).
Stéphane Chazelas
15

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

JPG
fonte
Graças, isso funciona, mas requer mais edição do que a outra solução.
Harold
2
+1 por incluir as aspas necessárias na maioria dos shells POSIX ( kshe bashsendo as únicas exceções).
Stéphane Chazelas