Bash 스크립트에서 백틱을 사용한 명령 대체의 이상한 출력

Bash 스크립트에서 백틱을 사용한 명령 대체의 이상한 출력
echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
echo                     "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
echo "$proxyUrlSedEscaped"

echo "???"

위의 출력은 다음과 같습니다.

testing:
\/proxyurl\/
&proxyurl&
???

마지막 에코 출력이 이전 에코 출력과 다른 이유는 무엇입니까?

명령줄을 통해 명령이 올바르게 실행됩니다: PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g', 출력:\/proxyurl\/

답변1

배쉬 매뉴얼에 따르면(그리고 POSIX):

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

`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`이는 이중 백슬래시가 단일 백슬래시로 이스케이프되었기 때문에 명령이 실행되었음을 의미합니다 . 그런 다음 sed에서 리터럴을 생성합니다.sedsed -e 's/[\/&]/\&/g'\&&

$(...)-style 명령 대체를 사용하면 이를 방지 할 수 있습니다 .

proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')

새로운 스타일 대체를 통해 모든 명령이 일반적인 해석을 가질 수 있습니다.

꼭 사용해야 한다면 `다소 이상한 이중 이스케이프도 작동합니다.

proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`

그것은 될 것이고 \\\\, \\그 다음에는 sed가 당신의 것이 될 것입니다 \.

관련 정보