バックティックを$()に置き換えても機能しません


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")"


これは機能しますが、他のソリューションよりも多くの編集が必要です。
ハロルド14年

2
ほとんどのPOSIXシェルで必要とされている引用符を含む(のための1 kshbash唯一の例外です)。
ステファンシャゼル14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.