백틱을 $ () 작동하지 않는 것으로 교체


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
또한 주목해야한다 `...`$(...)내측이되도록, 어쨌든 서브 쉘을 시작 (...)(공정 낭비) 필요하지 않다. 예 $( (...); (...) )를 들어 내부 서브 쉘이 필요할 수있는 공간이 필요합니다.
Stéphane Chazelas

15

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


고마워 이것은 작동하지만 다른 솔루션보다 더 많은 편집이 필요합니다.
Harold

2
대부분의 POSIX 쉘에 필요한 따옴표를 포함하여 +1 ( kshbash유일한 예외).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.