![Bash 스크립트에서 백틱을 사용한 명령 대체의 이상한 출력](https://linux55.com/image/114292/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%B0%B1%ED%8B%B1%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EB%AA%85%EB%A0%B9%20%EB%8C%80%EC%B2%B4%EC%9D%98%20%EC%9D%B4%EC%83%81%ED%95%9C%20%EC%B6%9C%EB%A0%A5.png)
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
이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 뒤에
$
,`
또는 가 오지 않는 한 문자 그대로의 의미를 유지합니다\
.
`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
이는 이중 백슬래시가 단일 백슬래시로 이스케이프되었기 때문에 명령이 실행되었음을 의미합니다 . 그런 다음 sed에서 리터럴을 생성합니다.sed
sed -e 's/[\/&]/\&/g'
\&
&
$(...)
-style 명령 대체를 사용하면 이를 방지 할 수 있습니다 .
proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')
새로운 스타일 대체를 통해 모든 명령이 일반적인 해석을 가질 수 있습니다.
꼭 사용해야 한다면 `
다소 이상한 이중 이스케이프도 작동합니다.
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`
그것은 될 것이고 \\\\
, \\
그 다음에는 sed가 당신의 것이 될 것입니다 \
.