zamiana backticka na $ () nie działa

17

Mam kilka starych skryptów, które próbuję zaktualizować. Część kodu skraca się do:

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

co daje oczekiwany wynik:

 abc def

Teraz Internet mówi mi, $()że nie mogę użyć backsticksa, ale kiedy próbuję:

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

X nie jest ustawiony i pojawia się błąd:

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

Co ja robię źle?

Harold
źródło

Odpowiedzi:

27

$(( … ))Składnia jest wyrażenie arytmetyczne .

Brakuje spacji między nimi $(a następującymi (, aby uniknąć składni wyrażeń arytmetycznych.

Sekcja dotycząca zastępowania poleceń w specyfikacji języka poleceń powłoki faktycznie ostrzega przed tym:

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
źródło
21
Należy zauważyć, że `...`i tak $(...)rozpocząć podpowłokę, więc wewnętrzna (...)nie jest potrzebna (marnowanie procesu). $( (...); (...) )Potrzebowałbyś miejsca w takich rzeczach, jak na przykład (gdzie mogą być potrzebne wewnętrzne podpowłoki).
Stéphane Chazelas
15

Próbować export X="$(echo "abc"; echo "def")"

JPG
źródło
Dzięki temu działa, ale wymaga więcej edycji niż inne rozwiązanie.
Harold
2
+1 za uwzględnienie cudzysłowów, które są potrzebne w większości powłok POSIX ( kshi bashsą jedynymi wyjątkami).
Stéphane Chazelas