명령 대체에 대한 두 가지 구문이 있습니다 : 달러 괄호와 백틱. 실행 top -p $(pidof init)
및 것은 top -p `pidof init`
동일한 출력을 제공합니다. 이 두 가지 방법으로 동일한 작업을 수행합니까, 아니면 차이점이 있습니까?
명령 대체에 대한 두 가지 구문이 있습니다 : 달러 괄호와 백틱. 실행 top -p $(pidof init)
및 것은 top -p `pidof init`
동일한 출력을 제공합니다. 이 두 가지 방법으로 동일한 작업을 수행합니까, 아니면 차이점이 있습니까?
답변:
구식 역 따옴표 ` `
는 백 슬래시와 중첩을 약간 다르게 처리합니다. 새로운 스타일 $()
은 그 사이의 모든 것을 ( )
명령으로 해석 합니다.
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는 ` `
자신의 목적으로 사용 합니다.이 답변을 쓰는 것은 고통 스럽습니다 :)
{ }
일반적으로 "중괄호"또는 "중괄호"라고 en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
에서는 죽은 키이므로 이중 백틱 (일반적으로 할 수없는 것을 잊어 버림) 또는 백틱을 입력해야합니다. 고통.
분명한 차이점은 중첩 할 수있는 동안 백틱을 중첩 할 수 없다는 것 $()
입니다. 어쩌면 둘 다 레거시 이유로 존재할 수 있습니다. 마찬가지로 .
및 source
명령은 동의어입니다.
source
. 대시가 한 예입니다.
$(...)
하고 `...`
(후자 사용되지) 동안은 표준 .
표준이 아닌source
(t)csh
중첩 될 수 없습니다. 그래도 (t)csh
지원하지 않습니다 $(...)
. 그러나 지원 source
하지는 않습니다 .
.
$()
오래된 Bourne 쉘에서는 작동하지 않습니다. 그러나 내가 오래된 Bourne 쉘로 작업 한 지 수십 년 이 지났 습니다 .
또 다른 메모 $()
는 백틱을 사용하는 것보다 더 많은 시스템 리소스를 사용하지만 약간 빠릅니다.
에서 마스터 유닉스 쉘 스크립트 , 랜달 K. 마이클은 "파일 라인 라인에 의해을 처리하는 24 가지 방법을"이라는 장에서 테스트를 수행했다.
$()
스크립트를 사용하는 것보다 1 바이트 더 크게 만들기 때문입니다 `
(네스트를 중첩하지 않고 백 슬래시를 사용하지 않는다고 가정). 구문 분석이 더 빠르면 쉘마다 다양하며 파이프를 만드는 비용과 명령 대체가 수반되는 프로세스의 포크와 비교할 때 무시할만한 수준이 아닙니다.
다른 사람들이 여기에 말한 것을 추가하기 위해 백틱을 사용하여 인라인 주석을 시뮬레이션 할 수 있습니다.
echo foo `# I'm a comment!` bar
출력은 다음과 같습니다 foo bar
.
자세한 내용은 다음을 참조하십시오. https://stackoverflow.com/a/12797512 (해당 게시물 아래의 주석도 참고)
$()
구문은 기존의 Bourne 쉘 작동하지 않습니다.
새로운 껍질 ` `
과 $()
동일하지만, $()
당신이 둥지를 여러 명령을 필요로 할 때 사용하는 것이 훨씬 더 편리합니다.
예를 들면 :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
다음보다 입력 및 디버그가 더 쉽습니다.
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``