[bash] 쉘 프로그래밍에서 $ (command)와`command`의 차이점은 무엇입니까?

sh / ksh / bash에서 명령 출력을 변수로 저장하려면 다음 중 하나를 수행하십시오.

var=$(command)

또는

var=`command`

두 방법 사이에 차이가 있다면 무엇입니까?



답변

백틱 / 그래프는 에서처럼 쉽게 그 안에 중첩 될 수 있으므로 $()명령 대체 를 위해 사용되지 않습니다 . 백틱 / 그레이 마크 버전에서 백 슬래시를 구문 분석하는 방법과 같은 다른 차이점이 있습니다.$()$(echo foo$(echo bar))

항상 $ (…) 구문을 선호하는 몇 가지 이유로 BashFAQ / 082 를 참조하십시오 .

다양한 차이점에 대한 자세한 내용 은 POSIX 사양을 참조하십시오.


답변

그들은 똑같이 행동합니다. 차이점은 구문이다 : 그것은 둥지에 쉽게 $()이상 ``:

listing=$(ls -l $(cat filenames.txt))

vs.

listing=`ls -l \`cat filenames.txt\``


답변

2014 년 7 월 : 커밋 f25f5e6 ( Elia Pinto ( devzero2000) , 2014 년 4 월, Git 2.0)이 중첩 문제에 추가됩니다.

역 따옴표 형태는 기존의 명령 대체 방법이며 POSIX에서 지원합니다.
그러나 가장 간단한 용도를 제외한 모든 것이 빠르게 복잡해집니다.
특히, 포함 된 명령 대체 및 / 또는 큰 따옴표를 사용하려면 백 슬래시 문자로주의해서 이스케이프해야합니다
.

git / Documentation / CodingGuidelines가 언급 한 이유 는 다음과 같습니다.

우리는 $( ... )명령 대체를 선호 합니다. “과 달리 올바르게 중첩 됩니다.
Bourne이 처음부터 철자를 썼던 방식 이었지만 안타깝게도 그렇지 않습니다.

티턴 코멘트 :

이것이 `echo `foo`` 각각 고유 한 모호성으로 인해 일반적으로 작동하지 않는 이유 는 각각 ``이 열리거나 닫힐 수 있기 때문 입니다.
운이나 특수 기능으로 인해 특수한 경우에 작동 할 수 있습니다.


2016 년 1 월 업데이트 : Git 2.8 (2016 년 3 월)은 백틱을 완전히 제거합니다.

commit ec1b763을 참조하십시오 . 9c10377 커밋 , c7b793a 커밋 , 80a6b3f 커밋 , 9375dcf 커밋 , e74ef60 커밋 , 27fe43e 커밋 , 2525c51 커밋 , becd67f 커밋 , a5c98ac 커밋 , 8c311f9 커밋 , 57da049 커밋 , 1d9e86f 커밋 , 78ba28d 커밋 , efa639f 커밋 , 1be2fa0 커밋 , 커밋 38e9476 , 커밋 8823d2f , 커밋 32858a0 , 커밋 cd914d8(2016 년 1 월 12 일) Elia Pinto ( devzero2000) .
( Junio ​​C gitsterHamano 에 의해 병합 커밋 e572fef , 2016 년 1 월 22 일)

Git 2.8부터는 $(...)더 이상 없습니다 `...`.


답변

이전 백틱 양식이 사용될 때 백 슬래시는 $,`또는 \가 뒤에 오는 경우를 제외하고 문자 그대로의 의미를 유지합니다. 백 슬래시 앞에 있지 않은 첫 번째 백틱은 명령 대체를 종료합니다.

최신 $(command)형식을 사용하는 경우 괄호 안의 모든 문자가 명령을 구성합니다. 아무것도 특별하게 취급되지 않습니다.

두 형식 모두 중첩 될 수 있지만 백틱 형식은 다음과 같은 형식이 필요합니다.

`echo \`foo\`` 

반대로 :

$(echo $(foo))


답변

명령 내에서 사용할 수있는 이스케이프되지 않은 문자를 제외하고는 거의 차이가 없습니다. $ (…) 안에 `…` 명령을 넣을 수도 있습니다.보다 복잡한 2 단계 깊이 명령 대체를 위해 있고 그 반대도 가능합니다.

백 슬래시 문자 / 연산자는 약간 다르게 해석됩니다. 무엇보다도, `…` 대체 명령을 중첩 할 때 \로 내부 ` 문자를 이스케이프해야 하지만 $ () 섭을 사용하면 중첩을 자동으로 이해합니다.


답변

“두 방법 사이에 차이점이 있다면 무엇입니까?”

이 동작에주의하십시오 :

A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"

다음과 같은 결과가 나타납니다.

$A
A_VARIABLE

 


답변