замена backtick на $ () не работает

17

У меня есть несколько старых скриптов, которые я пытаюсь обновить. Часть кода сокращается до:

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

который дает ожидаемый результат:

 abc def

Теперь интернет говорит мне, $()что мне нужно использовать обратные ссылки , но когда я пытаюсь:

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

X не установлен и я получаю ошибку:

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

Что я делаю неправильно?

Гарольд
источник

Ответы:

27

$(( … ))Синтаксис представляет собой арифметическое выражение .

Отсутствует пробел между $(и следующим (, чтобы избежать синтаксиса арифметических выражений.

Раздел о подстановке команд в спецификации языка команд оболочки фактически предупреждает об этом:

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
источник
21
Следует отметить, что `...`и $(...)запускайте подоболочку в любом случае, так что внутренняя (...)часть не нужна (тратит впустую процесс). Вам понадобится место в таких вещах, как, $( (...); (...) )например, (где могут понадобиться внутренние подоболочки).
Стефан Шазелас
15

Пытаться export X="$(echo "abc"; echo "def")"

JPG
источник
Спасибо, это работает, но требует большего редактирования, чем другое решение.
Гарольд
2
+1 за включение кавычек, которые необходимы в большинстве оболочек POSIX ( kshи bashявляются единственными исключениями).
Стефан Шазелас