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

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

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

답변1

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

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- 일관된 쉘.
~처럼무비시에이전 쉘에는 레거시가 ` `필요할 수 있습니다.

기술적 관점 외에도 이전 스타일에는 ` `시각적인 단점도 있습니다.

  • 눈에 띄기 어렵습니다.I like $(program) better than `program`
  • 작은따옴표와 혼동되기 쉽습니다.'`'`''`''`'`''`'
  • 입력하기가 매우 쉽지 않음(아마도 키보드의 표준 레이아웃에서도 발생하지 않음)

(SE ` `자체 목적상 이 답변을 작성하는 것은 고통스러웠습니다. :)

답변2

내가 관찰한 명백한 차이점은 역따옴표를 중첩할 수 없다는 것입니다 $(). 아마도 둘 다 레거시 이유로 존재할 수도 있습니다. 마찬가지로 .source명령은 동의어입니다.

답변3

$()이전 Bourne 쉘에서는 작동하지 않습니다. 하지만 오래된 Bourne 쉘을 사용한 지 수십 년 이 지났습니다.

답변4

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

존재하다마스터 Unix 쉘 스크립팅Randal K. Michael은 "파일을 한 줄씩 처리하는 24가지 방법" 장에서 테스트를 수행합니다.

관련 정보