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


258

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

var=$(command)

또는

var=`command`

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



중첩 된 이슈는 Git 코딩 가이드 라인에 자세히 나와 있습니다 : 아래의 답변을 참조하십시오 .
VonC

답변:


274

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

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

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


25
연결은 좋지만 텍스트는 인용 부호를 더 이상 사용 하지 않으며$(...) 대안으로 표시합니다.
Norman Grey

24
@NormanGray POSIX 단어가 말을하지 않을 수 있습니다 되지 하지만 말하는가 "the backquoted variety of command substitution is not recommended"단지 이럴되지 말하는 긴 장황한 방법입니다
SiegeX

11
POSIX는 백틱을 더 이상 사용하지 않고 $(...)대체 방법으로 추가 했습니다. 백틱으로 알려진 구현 버그는 없지만로 알려진 구현 버그가 많이 있습니다 $(...) . 따라서 이식성 문제의 경우 중첩되지 않은 통화에는 백틱을 사용하는 것이 좋습니다. $(...)재귀 파서가 필요하지만 기능을 도입 한 ksh86에는 사용되지 않았습니다. 올바른 구현 목록을 보려면 in-ulm.de/~mascheck/various/cmd-subst 를 확인하십시오 . 적합한 쉘은 케이스 D.2를 제외한 모든 케이스를 지원해야합니다.
schily

2
필요성은 다음과 같이 볼 수 있다는 POSIX에서 다른 일이 있습니다 deprecated, 예를 들어, 사용 waitpid()으로부터 전체 32 개 비트를 볼으로부터 방지 할 수 있으며, exit()매개 변수,하지만 최근 Bourne 쉘을 제외한 모든 쉘은 여전히 사용 waitpid()의 대신 waitid()이후 사용할 수 있습니다 호출 26 년
schily

대답의 링크는 백틱과 사이에 약간의 차이가 있음을 암시하며 $(), 이 부분은 설명서의이 부분에서 더 자세히 설명 합니다 . 차이점은 중첩에만 국한되지 않습니다.
일부 프로그래머 친구

39

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

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

vs.

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

10
echo $(echo \$abc)과 동일하지 않습니다 echo `echo \$abc`‍차이도 존재 - $(echo \`)$(echo \\)
Peter.O

또 다른 차이점은 echo foo `#comment`vs echo foo $(#comment)입니다. 두 번째는 작동하지 않습니다. (여러 줄 명령에 주석을

27

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부터는 $(...)더 이상 없습니다 `...`.


2
$()또한 POSIX 지정입니다. 백틱을 "POSIX 지원"으로 설명하는 인용 부호로 고유 한 의미를 갖는 것은 잘못된 것입니다. 백틱이 유일하게 지원되는 구문 인 유일한 POSIX Bourne입니다 (1970 년대).
Charles Duffy

25

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

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

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

`echo \`foo\`` 

반대로 :

$(echo $(foo))

1
백틱 버전과 $()버전은 모두 POSIX 호환입니다.
SiegeX

5

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

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


0

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

이 동작에주의하십시오 :

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

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

$A
A_VARIABLE

 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.