bash 스크립트에서 echo `echo \\\\\\z` 명령이 \\z 대신 \\z를 인쇄하는 이유는 무엇입니까?

bash 스크립트에서 echo `echo \\\\\\z` 명령이 \\z 대신 \\z를 인쇄하는 이유는 무엇입니까?

주문하다

echo `echo \\\\\\\z`

~에서이 책, 왜 인쇄되는지 이해가 안 돼요

\\z

bash 스크립트를 통해 실행될 때.

인쇄하면 될 것 같아요

\\\z

답변1

백틱은 백슬래시의 이중 처리를 효과적으로 제공합니다. (주 명령줄 처리 시 한 번, 명령 대체 명령 처리 시 한 번)

Kusalanda가 말했듯이 이것은 $(..)명령 대체와 다릅니다.

echo먼저, 기본적으로 백슬래시 이스케이프를 기본적으로 처리하지 않는 Bash에 대해 이야기하고 있는 것 같습니다. 예를 들어 which는 which prints 로 echo '\\'전달됩니다 . 백슬래시 자체를 처리하는 기능(예: Bash with Dash 또는 zsh)을 사용하는 경우 마지막 백슬래시가 출력 됩니다 .\\echo\\echoshopt -s xpg_echo\\\\z


Bash 매뉴얼에 따르면:

이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 뒤에 [달러 기호, 백틱 또는 백슬래시]가 오지 않는 한 문자 그대로의 의미를 유지합니다.

그래서 명령에서

echo `echo \\\\\\\z`      # 7 backslashes

쌍 은 \\먼저 단일 \s 로 축소되고 \z그대로 유지됩니다 \z(세 개 중 어느 것도 뒤에 오지 않으므로 백슬래시는 문자 그대로입니다). 그런 다음 백틱 안의 명령이 셸을 다시 실행합니다.

따라서 명령 대체 명령은 결국 다음과 같습니다.

echo \\\\z                 # 4 backslashes

여기서 \\쌍은 단일 \s로 줄어들고 인수는 다음 echo과 같습니다 \\z(두 개의 s를 통해 변경되지 않은 상태로 인쇄 echo, 위의 경고 참조).

달러 기호를 사용해도 비슷한 결과를 볼 수 있습니다. 예를 들면 다음과 같습니다.

var=foo
echo `echo \$var`

인쇄 foo.

POSIX에는 이상한 작은따옴표 예도 있습니다.:

echo `echo '\$x'`

인쇄 $x. (작은따옴표는 보호되지 않습니다 $.)


보다 합리적인 형태의 명령 대체는 $(...)해당 내용이 한 번만 처리된다는 것입니다.

echo $(echo \\\\\\\z)           # 7 backslashes

(3)을 인쇄 \\\z하고,

var=foo
echo $(echo \$var)

인쇄 $var.

또한보십시오:

답변2

초기 echo 명령은 셸에서 처리되므로 배수를 올바르게 확인 \하고 echo \\\z.

이 시점에서 쉘은 더 이상 관련되지 않습니다.

echo 명령은 \\\이를 확인하여 단일로 줄입니다 \. 즉, 리터럴이 필요합니다 \.

end 를 탈출할 필요가 없으므로 \로 축소할 수 있습니다 \\\z.

관련 정보