명령 대체 구문에는 달러 대괄호와 백틱을 사용하는 두 가지 구문이 있습니다. 실행 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가지 방법" 장에서 테스트를 수행합니다.