заміна 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.

21
Слід зазначити, що `...`і $(...)запустити підзарядку все одно, тому внутрішня (...)не потрібна (витрачайте процес). Вам знадобиться місце в таких речах, як, $( (...); (...) )наприклад, (там, де можуть знадобитися внутрішні підрозділи).
Стефан Шазелас

15

Спробуйте export X="$(echo "abc"; echo "def")"


Завдяки цьому все працює, але вимагає більше редагування, ніж інше рішення.
Гарольд

2
+1 за включення лапок, які потрібні у більшості оболонок POSIX ( kshі bashє єдиними винятками).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.