sh / ksh / bash에서 명령 출력을 변수로 저장하려면 다음 중 하나를 수행하십시오.
var=$(command)
또는
var=`command`
두 방법 사이에 차이가 있다면 무엇입니까?
sh / ksh / bash에서 명령 출력을 변수로 저장하려면 다음 중 하나를 수행하십시오.
var=$(command)
또는
var=`command`
두 방법 사이에 차이가 있다면 무엇입니까?
답변:
백틱 / 그래프는 에서처럼 쉽게 그 안에 중첩 될 수 있으므로 $()
명령 대체 를 위해 사용되지 않습니다 . 백틱 / 그레이 마크 버전에서 백 슬래시를 구문 분석하는 방법과 같은 다른 차이점이 있습니다.$()
$(echo foo$(echo bar))
항상 $ (...) 구문을 선호하는 몇 가지 이유로 BashFAQ / 082 를 참조하십시오 .
다양한 차이점에 대한 자세한 내용 은 POSIX 사양을 참조하십시오.
$(...)
대안으로 표시합니다.
"the backquoted variety of command substitution is not recommended"
단지 이럴되지 말하는 긴 장황한 방법입니다
$(...)
대체 방법으로 추가 했습니다. 백틱으로 알려진 구현 버그는 없지만로 알려진 구현 버그가 많이 있습니다 $(...)
. 따라서 이식성 문제의 경우 중첩되지 않은 통화에는 백틱을 사용하는 것이 좋습니다. $(...)
재귀 파서가 필요하지만 기능을 도입 한 ksh86에는 사용되지 않았습니다. 올바른 구현 목록을 보려면 in-ulm.de/~mascheck/various/cmd-subst 를 확인하십시오 . 적합한 쉘은 케이스 D.2를 제외한 모든 케이스를 지원해야합니다.
deprecated
, 예를 들어, 사용 waitpid()
으로부터 전체 32 개 비트를 볼으로부터 방지 할 수 있으며, exit()
매개 변수,하지만 최근 Bourne 쉘을 제외한 모든 쉘은 여전히 사용 waitpid()
의 대신 waitid()
이후 사용할 수 있습니다 호출 26 년
그들은 똑같이 행동합니다. 차이점은 구문이다 : 그것은 둥지에 쉽게 $()
이상 ``
:
listing=$(ls -l $(cat filenames.txt))
vs.
listing=`ls -l \`cat filenames.txt\``
echo $(echo \$abc)
과 동일하지 않습니다 echo `echo \$abc`
차이도 존재 - $(echo \`)
및 $(echo \\)
echo foo `#comment`
vs echo foo $(#comment)
입니다. 두 번째는 작동하지 않습니다. (여러 줄 명령에 주석을
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 gitster
Hamano 에 의해 병합 -- 커밋 e572fef , 2016 년 1 월 22 일)
Git 2.8부터는 $(...)
더 이상 없습니다 `...`
.
$()
또한 POSIX 지정입니다. 백틱을 "POSIX 지원"으로 설명하는 인용 부호로 고유 한 의미를 갖는 것은 잘못된 것입니다. 백틱이 유일하게 지원되는 구문 인 유일한 POSIX Bourne입니다 (1970 년대).
이전 백틱 양식이 사용될 때 백 슬래시는 $,`또는 \가 뒤에 오는 경우를 제외하고 문자 그대로의 의미를 유지합니다. 백 슬래시 앞에 있지 않은 첫 번째 백틱은 명령 대체를 종료합니다.
최신 $(command)
형식을 사용하는 경우 괄호 안의 모든 문자가 명령을 구성합니다. 아무것도 특별하게 취급되지 않습니다.
두 형식 모두 중첩 될 수 있지만 백틱 형식은 다음과 같은 형식이 필요합니다.
`echo \`foo\``
반대로 :
$(echo $(foo))
$()
버전은 모두 POSIX 호환입니다.
명령 내에서 사용할 수있는 이스케이프되지 않은 문자를 제외하고는 거의 차이가 없습니다. $ (...) 안에 `...` 명령을 넣을 수도 있습니다.보다 복잡한 2 단계 깊이 명령 대체를 위해 있고 그 반대도 가능합니다.
백 슬래시 문자 / 연산자는 약간 다르게 해석됩니다. 무엇보다도, `...` 대체 명령을 중첩 할 때 \로 내부 ` 문자를 이스케이프해야 하지만 $ () 섭을 사용하면 중첩을 자동으로 이해합니다.