$ (stuff)와`stuff`의 차이점은 무엇입니까?


265

명령 대체에 대한 두 가지 구문이 있습니다 : 달러 괄호와 백틱. 실행 top -p $(pidof init)및 것은 top -p `pidof init`동일한 출력을 제공합니다. 이 두 가지 방법으로 동일한 작업을 수행합니까, 아니면 차이점이 있습니까?


18
BashFAQ / 082 도 참조하십시오 .
Dennis Williamson

42
잠시 동안 나는 이것이 jQuery 질문이라고 생각했다.
David Murdoch

결과는 쉘에 따라 다를 수 있습니다-일부는 둘 다 지원합니다.
artdanil

답변:


359

구식 역 따옴표 ` `는 백 슬래시와 중첩을 약간 다르게 처리합니다. 새로운 스타일 $()은 그 사이의 모든 것을 ( )명령으로 해석 합니다.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

중첩 된 역 따옴표가 이스케이프 된 경우 작동합니다.

echo `uname | \`echo cat\``
Linux

백 슬래시 재미 :

echo $(echo '\\')
\\

echo `echo '\\'`
\

새로운 스타일 $()은 모든 POSIX 호환 쉘에 적용됩니다 .
으로 mouviciel는 지적, 이전 스타일은 ` `나이가 껍질에 필요한 수 있습니다.

기술적 인 관점에서 볼 때 구식 스타일 ` `에는 시각적 인 단점이 있습니다.

  • 알아 채기 어렵다 : I like $(program) better than `program`
  • 작은 따옴표와 쉽게 혼동됩니다. '`'`''`''`'`''`'
  • 타이핑하기가 쉽지 않음 (키보드의 표준 레이아웃에는 없을 수도 있음)

(그리고 SE는 ` `자신의 목적으로 사용 합니다.이 답변을 쓰는 ​​것은 고통 스럽습니다 :)


10
내가 추가 할 수있는 유일한 것은 괄호 ( '[')가 아니라 '(')
파렌이라고 부르는 것

@Kendall : 여기에 '{'가 그 기간 동안 왼쪽 괄호라고 생각했습니다.
SamB

5
@Sam은 : { }일반적으로 "중괄호"또는 "중괄호"라고 en.wikipedia.org/wiki/Braces_(punctuation)#Braces
의 Jørn Schou은-타고

2
또한 '{'를 중괄호라고도합니다. 다른 것들을 대괄호라고하면 한정자를 "곱슬"로 추가 해야하는 것이 이상해 보이지만 실제로 컬이 있기 때문일 것입니다.
Kendall Helmstetter Gelner

1
@ slim 나는 미국 / 영국 키보드에서 알지 못하지만 스페인어 키보드 `에서는 죽은 키이므로 이중 백틱 (일반적으로 할 수없는 것을 잊어 버림) 또는 백틱을 입력해야합니다. 고통.
Darkhogg

41

분명한 차이점은 중첩 할 수있는 동안 백틱을 중첩 할 수 없다는 것 $()입니다. 어쩌면 둘 다 레거시 이유로 존재할 수 있습니다. 마찬가지로 .source명령은 동의어입니다.


10
일부 Bourne 파생 쉘은 인식하지 못합니다 source. 대시가 한 예입니다.
Dennis Williamson

14
그건 사실이 아니야. 더 고통스럽게 backtick를 어느 레벨로나 중첩시킬 수 있습니다. 모두 참고 $(...)하고 `...`(후자 사용되지) 동안은 표준 .표준이 아닌source
스테판 Chazelas가

3
수정 만 (t)csh중첩 될 수 없습니다. 그래도 (t)csh지원하지 않습니다 $(...). 그러나 지원 source하지는 않습니다 ..
Stéphane Chazelas

28

$()오래된 Bourne 쉘에서는 작동하지 않습니다. 그러나 내가 오래된 Bourne 쉘로 작업 한 수십 이 지났 습니다 .


1970 년대와 1980 년대 초반에 맞습니까?
Christopher

6

또 다른 메모 $()는 백틱을 사용하는 것보다 더 많은 시스템 리소스를 사용하지만 약간 빠릅니다.

에서 마스터 유닉스 쉘 스크립트 , 랜달 K. 마이클은 "파일 라인 라인에 의해을 처리하는 24 가지 방법을"이라는 장에서 테스트를 수행했다.


2
이 주장은 말도 안됩니다. 파서에 다른 표기법을 사용하기 때문에 더 빠른 이유는 없습니다.
schily

@ schily : 아마도, 나는 책에서 인용 만하면 자세한 내용을 읽을 수 있습니다.
cuonglm

3
@schily에 동의하는 경향이 있습니다 ... 왜 더 많은 리소스가 필요합니까?
와일드 카드

2
@Wildcard, $()스크립트를 사용하는 것보다 1 바이트 더 크게 만들기 때문입니다 `(네스트를 중첩하지 않고 백 슬래시를 사용하지 않는다고 가정). 구문 분석이 더 빠르면 쉘마다 다양하며 파이프를 만드는 비용과 명령 대체가 수반되는 프로세스의 포크와 비교할 때 무시할만한 수준이 아닙니다.
Stéphane Chazelas

5

다른 사람들이 여기에 말한 것을 추가하기 위해 백틱을 사용하여 인라인 주석을 시뮬레이션 할 수 있습니다.

echo foo `# I'm a comment!` bar

출력은 다음과 같습니다 foo bar.

자세한 내용은 다음을 참조하십시오. https://stackoverflow.com/a/12797512 (해당 게시물 아래의 주석도 참고)


1

$()구문은 기존의 Bourne 쉘 작동하지 않습니다.
새로운 껍질 ` `$()동일하지만, $()당신이 둥지를 여러 명령을 필요로 할 때 사용하는 것이 훨씬 더 편리합니다.

예를 들면 :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

다음보다 입력 및 디버그가 더 쉽습니다.

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``

1
$ ()는 멋지게 보일 수 있지만 관련 파서를 구현하면 이중 재귀 파서가 필요하기 때문에 어려움이 있습니다.
schily

6
@schily 반면에, 좋은 파서가없는 쉘은 무엇인가.
Emmanuel

1
문제는 파서를 호출하기 전에 문자열이 끝나는 위치를 알아야한다는 것입니다. 백틱에서는 비교적 간단하지만 셸에서 다양한 용도로 사용되므로 괄호로는 어렵습니다. 따라서 Bourne Shell에는 존재하지 않는 방식으로 구문 분석기가 두 번 필요합니다.
schily
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.