답변1
백틱은 백슬래시의 이중 처리를 효과적으로 제공합니다. (주 명령줄 처리 시 한 번, 명령 대체 명령 처리 시 한 번)
Kusalanda가 말했듯이 이것은 $(..)
명령 대체와 다릅니다.
echo
먼저, 기본적으로 백슬래시 이스케이프를 기본적으로 처리하지 않는 Bash에 대해 이야기하고 있는 것 같습니다. 예를 들어 which는 which prints 로 echo '\\'
전달됩니다 . 백슬래시 자체를 처리하는 기능(예: Bash with Dash 또는 zsh)을 사용하는 경우 마지막 백슬래시가 출력 됩니다 .\\
echo
\\
echo
shopt -s xpg_echo
\\
\
\z
이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 뒤에 [달러 기호, 백틱 또는 백슬래시]가 오지 않는 한 문자 그대로의 의미를 유지합니다.
그래서 명령에서
echo `echo \\\\\\\z` # 7 backslashes
쌍 은 \\
먼저 단일 \
s 로 축소되고 \z
그대로 유지됩니다 \z
(세 개 중 어느 것도 뒤에 오지 않으므로 백슬래시는 문자 그대로입니다). 그런 다음 백틱 안의 명령이 셸을 다시 실행합니다.
따라서 명령 대체 명령은 결국 다음과 같습니다.
echo \\\\z # 4 backslashes
여기서 \\
쌍은 단일 \
s로 줄어들고 인수는 다음 echo
과 같습니다 \\z
(두 개의 s를 통해 변경되지 않은 상태로 인쇄 echo
, 위의 경고 참조).
달러 기호를 사용해도 비슷한 결과를 볼 수 있습니다. 예를 들면 다음과 같습니다.
var=foo
echo `echo \$var`
인쇄 foo
.
echo `echo '\$x'`
인쇄 $x
. (작은따옴표는 보호되지 않습니다 $
.)
보다 합리적인 형태의 명령 대체는 $(...)
해당 내용이 한 번만 처리된다는 것입니다.
echo $(echo \\\\\\\z) # 7 backslashes
(3)을 인쇄 \\\z
하고,
var=foo
echo $(echo \$var)
인쇄 $var
.
또한보십시오:
답변2
초기 echo 명령은 셸에서 처리되므로 배수를 올바르게 확인 \
하고 echo \\\z
.
이 시점에서 쉘은 더 이상 관련되지 않습니다.
echo 명령은 \\\
이를 확인하여 단일로 줄입니다 \
. 즉, 리터럴이 필요합니다 \
.
end 를 탈출할 필요가 없으므로 \
로 축소할 수 있습니다 \\\z
.